C语言程序设计
----教学过程篇字符数组
字符数组字符数组中的每一个元素都是用来存放字符数据的,其定义如下:
char 数组名 [数组长度 ]
例如,char a[10]
字符数组的初始化
char a[3]={?a?,?b?,?c?};
字符数组这样就把三个字符赋值到 a[0]到 a[2]中去了,如果花括号中提供的初值长度超过了数组长度,则语法错误,如果小于初值长度,则只将这些字符赋给数组前面的元素,其余的自动定义为空字
(‘ \0’)
字符数组的引用:
和普通数组一样,a[0]表示第一个元素字符数组
字符串和字符串结束标志
C语言中,将字符串作为字符数组来处理,该字符串的长度与数组的有效长度相等,系统会对字符串常量自动加一个
‘ \0’作为结束符例如,char a[]={“hello”};
等价于,char a[]=“hello”;
等价于,char a[]={?h?,?e?,?l?,?l?,?o?,?\0?};
该数组的实际长度为 6,有效长度为 5
字符数组
注意:
字符数组并不要求其最后一个字符为
‘ \0’,只有以下情况,系统会自动给字符数组后加‘ \0’
1.用字符串常量给数组赋值,系统给该字符数组最后的元素设为‘ \0’
如,char a[]=“good”;
2.当赋初始值小于字符数组的长度时,
小于部分元素自动设为‘ \0’
字符数组
字符数组的输入输出
----字符数组的输出方法有两种:
1.用,%C”格式,逐个元素的输出
2.用,%s”格式,将整个字符串一起输出例如,char a[]={“hello”};
printf(“%S\n”,a);
注意:
1.输出的字符不包括‘ \0’
字符数组
2.用,%s”格式输出,printf函数的输出项是字符数组名,而不是字符数组元素例如,char a[]={“hello”};
正确,printf(“%s”,a);
错误,printf(“%s”,a[0]);
3.如果字符数组的长度大于字符串实际长度,只输出到‘ \0’为止例如,char a[10]={“hello”};
printf(“%s”,a); 仅输出 hello
字符数组
4.如果一个字符数组包含一个以上的
‘ \0’,则遇到第一个‘ \0’时输出就结束了如,char a[6]={?a?,?b?,?c?,?\0?,d,?\0?};
printf(“%s”,a);
其输出为,abc
字符数组
----字符数组的输入可以用 scanf函数来输入一个字符串格式如下:
char a[10];
正确,scanf(“%s”,a);
错误,scanf(“%s”,&a);
注意:
输入的字符串长度一定要小于定义的长度字符数组注意一:
如果要用一个 scanf函数同时输如多个字符串,则中间用空格隔开例如,char a[5],b[5],c[5];
scanf(“%s%s%s”,a,b,c);
如果输入为,how are you!
则 how保存到 a[10]中
are保存到 b[10]中
you!保存到 c[10]中字符数组注意二:
如果输入一个字符串时输入了“空格”,则只将空格前的字符送到字符数组中例如,char a[20];
scanf(“%s”,a);
printf(“%s”,a);
如果输入为,hello china!
则输出为,hello
空格后的字符并没有保存到字符数组中字符数组
字符串处理函数
----puts(字符数组名 )
可以直接输出该字符数组中的字符串,
同时该字符串中还可以包含转意字符例如,char a[10]={“hello\tchina”};
puts(a);
则输出为,hello china
字符数组
----gets(字符数组名 )
允许用户从终端输入一个字符串到数组中,并得到一个函数返回值,该值是字符数组的起始地址从键盘输入时,如果输入了空格,空格后的字符也输入到数组中(不同于 scanf)
例如,char a[20];
int address;
gets(a);
puts(a);
字符数组
----strcat( 字符数组名 1,字符数组名 2)
连接两个字符数组中的字符串,把字符串 2连接到字符串 1的后面说明:
1.字符数组 1必须足够大,可以容纳后面的字符串
2.每个要连接的字符串后面都要以‘ \0’
结束字符数组
----strcpy(字符数组名 1,字符数组名 2)
将字符数组 2中的元素全部复制到字符数组 1
中去说明:
1.字符数组 1的长度一定要大于或等于字符数组 2的长度
2.字符数组 1必须是字符数组名,字符数组 2
可以是数组名,也可以是字符串常量如,strcpy(str1,str2);
strcpy(str1,”china”)
字符数组
3.在使用 strcpy复制时,连同字符串后的
‘ \0’也一同复制到 str1数组中
4.C语言中不支持直接在两个字符数组中进行赋值,只能通过 strcpy函数来完成两个字符数组间的赋值字符数组
----strcmp(字符数组 1,字符数组 2)
比较两个字符数组(或字符串常量)
是否相等,如果完全相等,则返回值为
0
例如要判断两个字符数组中的有效元素是否完全相同 (数组长度不比较 ):
if(strcmp(str1,str2)==0)
字符数组
----strlen(字符数组 )
测试字符数组的实际长度的函数,不包括‘ \0’,返回值为长度,也可以直接测试字符串常量的长度
----strlwr(字符数组 )
将字符数组中所有的大写字母转换为小写字母字符数组
----strupr(字符数组 )
将字符数组中的所有小写字母换成大些字母字符数组 (程序一 )
输入一行字符,统计单词个数,单词间用空格隔开
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
int i=0,count=0;
char a[100];
printf("please input a string:\n");
gets(a);
字符数组 (程序一 )
while(a[i]!='\0')
{
if(a[i]==32)
{
count++;
}
i++;
}
count++;
printf("the number of words is,%d\n",count);
system("pause");
}
字符数组 (程序二 )
P142 T7.13
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
int i=0,j;
char a[10],b[10],c[20];
printf("please input two letterarrays:\n");
scanf("%s%s",a,b);
字符数组 (程序二 )
for(i=0;i<strlen(a);i++)
{
c[i]=a[i]; }
for(j=0;i<(strlen(a)+strlen(b));i++,j++)
{
c[i]=b[j];
}
c[i]='\0';
printf("%s\n",c);
system("pause");
}
字符数组 (程序三 )
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
int i=0,j=0,flag=1;
char a[100],c;
printf("请输入要变成密码的文件,\n");
gets(a);
while(a[i]!='\0')
{
if((a[i]>=65)&&(a[i]<=90))
字符数组 (程序三 )
{
j=a[i]-65+1;
j=26-j+1;
a[i]=64+j;
}
if((a[i]>=97)&&(a[i]<=122))
{
j=a[i]-97+1;
j=26-j+1;
a[i]=96+j;
}
i++;
字符数组 (程序三 )
}
printf("密码是,%s\n",a);
printf("你想把以上密码变成原文吗?( y/n) \n");
scanf("%c",&c);
if((c=='y')||(c=='Y'))
{
for(i=0;a[i]!='\0';i++)
{
if((a[i]>=65)&&(a[i]<=90))
{
j=a[i]-65+1;
字符数组 (程序三 )
j=26-j+1;
a[i]=64+j;
}
if((a[i]>=97)&&(a[i]<=122))
{
j=a[i]-97+1;
j=26-j+1;
a[i]=96+j;
}
}
printf("原文是,%s\n",a);
flag=0;
字符数组 (程序三 )
}
else
{
if((c=='N')||(c=='n'))
{
printf("谢谢使用密码生成系统! \n");
flag=0;
}
else
{
printf("输入错误 !\n"); }
字符数组 (程序三 )
}
system("pause");
}