第 9讲 字符数组一,字符数组的定义二,字符数组的初始化三,字符数组的输入与输出四、字符串函数一,字符数组的定义字符数组:用来存放字符型数据的数组 。
格式:
char 数组名 [常量表达式 ],··· ;
char 数组名 [常量表达式 1][常量表达式 2],···
注意:
字符数组的定义、引用、初始化遵循,数组”
的规定。
在字符数组中,每一个元素只能存放一个字符。
例,char a[10],b[30];
char s[10][20],h[20][100];
二维字符数组,可以看作是一个字符串数组。
二,字符数组的初始化字符数组的赋值要符合数组的要求,除了在定义时初始化可以用字符串赋初值,其余只能一个元素一个元素地赋值。
1)给所有元素赋初值:
例 char s1[7]={‘s’,’t’,’r’,’i’,’n’,’g’,’!’};
char s2[ ]={‘s’,’t’,’r’,’i’,’n’,’g’,’!’};
!gnirts存储形式为:
1、一维字符数组初始化例 char s3[8]={’s’,’t’,’r’,’i’,’n’,’g’,’!’,’\0’};
char s4[8]={"string!"};
char s5[8]="string!";
存储形式为,\0!gnirts
C语言中,规定了一个“字符串结束标记”,以字符’ \0’代表。
说明:
在字符数组中,并不要求它最后的一个字符为,\0”,
也可以没有,\0”。
例,char s[5]=“China”;
也是合法的
字符串在实际存储时,系统会自动的在其尾部添加一个结束标志’ \0’。
‘ \0’代表 ASCII码为 0的字符,是一个空操作符,表示什么也不干。
2)给部分元素赋初值:
例,char s1[9]={’C’,’h’,’i’,’n’,’a’,’!’};
char s2[9]={’C’,’h’,’i’,’n’,’a’,’!’,’\0’};
char s3[9]={”China!”};
char s4[9]=,China!”;
存储形式为,
\0 \0\0!anihC
2、二维字符数组初始化二维字符串数组的初始化,可以采用二维字符数组初始化形式或者字符串初始化形式例,char name[2][10]={{’J’,’o’,’h’,’n’,’\0’},
{’M’,’a’,’r’,’r’,’y’,’\0’}};
char name[2][10]={{”John”},{”Marry”}};
char name[2][10]={”John”,”Marry”};
这三种方法效果一样。
三,字符数组的输入与输出
1.利用格式符 %c逐个输入、输出字符:
例,char str[10];
int i;
for ( i=0; i<9; i++ )
scanf("%c",&str[i]);
for ( i=0; i<9; i++ )
printf("%c",str[i]);
2.利用格式符 %s,可以一次输入、输出字符串。
例,char str[10];
scanf("%s",str );
printf("%s\n",str );
%s,遇第一个空白符(空格,Tab,回车)结束输入,
遇第一个‘ \0’结束输出。
输入,program
输出,program
例,char s1[10],s2[15];
scanf("%s%s",s1,s2 );
printf("%s %s\n",s1,s2 );
输入,program C
输出,program C
输入,How are you
输出,How are
scanf函数虽然给多个字符的输入提供了简便的方法,但对于有空格的字符串的输入却有限制。
3.利用字符串输入输出函数
C语言要求在使用字符串函数时,要包含头文件
stdio.h
1,字符串输入函数 gets( );
作用,是将一个字符串输入到字符数组中,当遇到第一个回车时结束输入格式,gets(字符数组名 );
gets( )函数同 scanf( )函数一样,在读入一个字符串后,系统自动在字符串后加上一个字符串结束标志’ \0’。
注意:
1,函数 gets( )只能一次输入一个字符串。
2,函数 gets( )可以读入包含空格和 TAB的全部字符,
直到遇到回车为止。
使用格式符,%s”的函数 scanf( ),以空格,TAB
或回车作为一段字符串的间隔符或结束符,所以含有空格或 TAB的字符串要用 gets( )函数输入。
例,函数 gets( )与 scanf( )的区别
#include <stdio.h>
main( )
{
char str1[20],str2[20];
gets(str1);
scanf("%s",str2);
printf("str1,%s\n",str1);
printf("str2,%s\n",str2);
}
输入,program C
program C
输出,str1,program C
str2,program
2,字符串输出函数 puts( )
作用:将一个字符串(以’ \0’结束的字符序列)输出。
格式,puts(字符数组名 );
或 puts(字符串 );
注意:
1,函数 puts( )一次只能输出一个字符串。
2,函数 puts( )可以输出转义字符。
3,函数 puts( )输出字符串后自动换行。
printf( )函数可以同时输出多个字符串,并且能灵活控制是否换行。所以 printf( )函数比 puts( )
函数更为常用。
例,函数 puts( )与 printf( )的区别
#include <stdio.h>
main( )
{
char str1[ ]="student",str2[ ]="teacher";
puts(str1);
puts(str2);
printf("%s",str1);
printf("%s\n%s",str1,str2);
}
四、字符串函数
C语言提供了很多字符串操作函数,其对应的头文件为 <string.h>
1,测字符串长度函数 strlen
引用形式,strlen(字符数组 )
作用,strlen( )是测试字符串实际长度的函数,
它的返回值是字符串中字符的个数( 不包含 ’ \0’
的个数 )。
例:
char str[12]={“computer”};
printf(“%d”,strlen(str));
printf(“%d”,strlen(“computer”));
输出的结果都是 8
例,函数 strlen( )的使用。
#include <stdio.h>
#include <string.h>
main()
{ int i;
char str1[20],str2[20];
gets(str1); gets(str2);
for(i=0;str2[i]!='\0';i++);
printf("%s,%d\n",str1,strlen(str1));
printf("%s,%d\n",str2,i);
printf("%s,%d\n",“Good luck",strlen(“Good luck"));
}
输入,Good luck
Good luck
输出,Good luck,9
Good luck,9
Good luck,9
这两句的功能等同于函数 strlen( ),i 返回串长
2.字符串拷贝函数 strcpy
引用形式,strcpy(字符数组 1,字符串 2)
作用:将字符串 2复制到字符数组 1中。
注意:
( 1) 字符数组 1必须足够大,以便容纳字符串
2的内容。
( 2) 字符串 2可以是字符数组名或者字符串常量。当字符串 2为字符数组名时,只复制第一个’ \0’前面的内容(含’ \0’),其后内容不复制。
例,函数 strcpy( )的使用。
main( )
{int i;
char str1[20],str2[ ]=“Good luck";
char str3[20],str4[ ]=“Good luck";
strcpy(str1,str2);
for (i=0;str4[i]!='\0';i++) str3[i]=str4[i];
str1[i]='\0';
printf("str1,%s\t str2,%s\n",str1,str2);
printf("str3,%s\t str4,%s\n",str3,str4);
}
输出,
str1:Good luck str2:Good luck
str3:Good luck str4:Good luck
这两句的功能等同于函数 strcpy( )
3.字符串连接函数 strcat
引用形式,strcat(字符数组 1,字符串 2)
作用:将字符串 2的内容复制连接在字符数组 1
的后面,其返回值为字符数组 1的地址。
注意:
( 1)字符数组 1不能是字符串常量,并且必须足够大,以便可以继续容纳字符串 2的内容。
( 2)连接前字符数组 1的’ \0’将被字符串 2覆盖,
连接后生成的新的字符串的最后保留一个’ \0’。
#include <string.h>
main( )
{char str1[12]={“Good,};
char str2[ ]={“luck!”};
printf(“%s”,strcat(str1,str2));
}
例,函数 strcat( )的使用。
其状态如下:
输出,
Good luck!
G o o d \0
l u c k ! \0
G o o d l u c k ! \0
str1
str2
str1
4.字符串比较函数 strcmp
引用形式,strcmp(字符串 1,字符串 2)
作用:
比较字符串 1和字符串 2。两个字符串从左至右逐个字符比较(按照字符的 ASCII码值的大小),
直到字符不同或者遇见’ \0’为止。
如果全部字符都相同,则返回值为 0。如果不相同,则返回两个字符串中第一个不相同的字符的 ASCII码值的差,即字符串 1大于字符串 2时函数值为正,否则为负。
例,函数 strcmp( )的使用。
main( )
{char str1[ ]="abc",str2[ ]="abc";
char str3[ ]="abc",str4[ ]="abc";
int i=0;
while(str3[i]==str4[i]&&str3[i]!='\0') i++;
i=str3[i]-str4[i];
printf(“str1&str2,%d\n",strcmp(str1,str2));
printf("str3&str4,%d\n",i);
}
输出,
str1&str2,0
str3&str4,0
这两句的功能等同于函数 strcmp( )
5,strlwr(字符串 )
strlwr( )的作用是将字符串中大写字母转换成小写字母。
6,strupr(字符串 )
strupr()的作用是将字符串中小写字母转换成大写字母。
大小写转换函数:
例,编写用户登录程序
#include "string.h"
main( )
{ char username[10],name[10]="zhangsan";
gets( username );
if ( strcmp(username,name) )
printf(" Username are wrong !\n");
else
printf("You are right !\n");
puts( username );
}
例,有 3个英文字符组成的字符串,要求按照英文字母顺序输出。
#include <string.h>
main( )
{char name[3][20]={"John",“Jan","Anny"};
char str[20];
int i;
for(i=0;i<3;i++) /*字符串中所有字符转换为小写字母 */
strlwr(name[i]); /*按照英文字母顺序排序 */
if (strcmp(name[0],name[1])>0)
{strcpy(str,name[0]);
strcpy(name[0],name[1]);
strcpy(name[1],str);
}
if (strcmp(name[0],name[2])>0)
{strcpy(str,name[0]);
strcpy(name[0],name[2]);
strcpy(name[2],str);
}
if (strcmp(name[1],name[2])>0)
{strcpy(str,name[1]);
strcpy(name[1],name[2]);
strcpy(name[2],str);
}
for(i=0;i<3;i++)
printf("%s\n",name[i]);
}
格式:
char 数组名 [常量表达式 ],··· ;
char 数组名 [常量表达式 1][常量表达式 2],···
注意:
字符数组的定义、引用、初始化遵循,数组”
的规定。
在字符数组中,每一个元素只能存放一个字符。
例,char a[10],b[30];
char s[10][20],h[20][100];
二维字符数组,可以看作是一个字符串数组。
二,字符数组的初始化字符数组的赋值要符合数组的要求,除了在定义时初始化可以用字符串赋初值,其余只能一个元素一个元素地赋值。
1)给所有元素赋初值:
例 char s1[7]={‘s’,’t’,’r’,’i’,’n’,’g’,’!’};
char s2[ ]={‘s’,’t’,’r’,’i’,’n’,’g’,’!’};
!gnirts存储形式为:
1、一维字符数组初始化例 char s3[8]={’s’,’t’,’r’,’i’,’n’,’g’,’!’,’\0’};
char s4[8]={"string!"};
char s5[8]="string!";
存储形式为,\0!gnirts
C语言中,规定了一个“字符串结束标记”,以字符’ \0’代表。
说明:
在字符数组中,并不要求它最后的一个字符为,\0”,
也可以没有,\0”。
例,char s[5]=“China”;
也是合法的
字符串在实际存储时,系统会自动的在其尾部添加一个结束标志’ \0’。
‘ \0’代表 ASCII码为 0的字符,是一个空操作符,表示什么也不干。
2)给部分元素赋初值:
例,char s1[9]={’C’,’h’,’i’,’n’,’a’,’!’};
char s2[9]={’C’,’h’,’i’,’n’,’a’,’!’,’\0’};
char s3[9]={”China!”};
char s4[9]=,China!”;
存储形式为,
\0 \0\0!anihC
2、二维字符数组初始化二维字符串数组的初始化,可以采用二维字符数组初始化形式或者字符串初始化形式例,char name[2][10]={{’J’,’o’,’h’,’n’,’\0’},
{’M’,’a’,’r’,’r’,’y’,’\0’}};
char name[2][10]={{”John”},{”Marry”}};
char name[2][10]={”John”,”Marry”};
这三种方法效果一样。
三,字符数组的输入与输出
1.利用格式符 %c逐个输入、输出字符:
例,char str[10];
int i;
for ( i=0; i<9; i++ )
scanf("%c",&str[i]);
for ( i=0; i<9; i++ )
printf("%c",str[i]);
2.利用格式符 %s,可以一次输入、输出字符串。
例,char str[10];
scanf("%s",str );
printf("%s\n",str );
%s,遇第一个空白符(空格,Tab,回车)结束输入,
遇第一个‘ \0’结束输出。
输入,program
输出,program
例,char s1[10],s2[15];
scanf("%s%s",s1,s2 );
printf("%s %s\n",s1,s2 );
输入,program C
输出,program C
输入,How are you
输出,How are
scanf函数虽然给多个字符的输入提供了简便的方法,但对于有空格的字符串的输入却有限制。
3.利用字符串输入输出函数
C语言要求在使用字符串函数时,要包含头文件
stdio.h
1,字符串输入函数 gets( );
作用,是将一个字符串输入到字符数组中,当遇到第一个回车时结束输入格式,gets(字符数组名 );
gets( )函数同 scanf( )函数一样,在读入一个字符串后,系统自动在字符串后加上一个字符串结束标志’ \0’。
注意:
1,函数 gets( )只能一次输入一个字符串。
2,函数 gets( )可以读入包含空格和 TAB的全部字符,
直到遇到回车为止。
使用格式符,%s”的函数 scanf( ),以空格,TAB
或回车作为一段字符串的间隔符或结束符,所以含有空格或 TAB的字符串要用 gets( )函数输入。
例,函数 gets( )与 scanf( )的区别
#include <stdio.h>
main( )
{
char str1[20],str2[20];
gets(str1);
scanf("%s",str2);
printf("str1,%s\n",str1);
printf("str2,%s\n",str2);
}
输入,program C
program C
输出,str1,program C
str2,program
2,字符串输出函数 puts( )
作用:将一个字符串(以’ \0’结束的字符序列)输出。
格式,puts(字符数组名 );
或 puts(字符串 );
注意:
1,函数 puts( )一次只能输出一个字符串。
2,函数 puts( )可以输出转义字符。
3,函数 puts( )输出字符串后自动换行。
printf( )函数可以同时输出多个字符串,并且能灵活控制是否换行。所以 printf( )函数比 puts( )
函数更为常用。
例,函数 puts( )与 printf( )的区别
#include <stdio.h>
main( )
{
char str1[ ]="student",str2[ ]="teacher";
puts(str1);
puts(str2);
printf("%s",str1);
printf("%s\n%s",str1,str2);
}
四、字符串函数
C语言提供了很多字符串操作函数,其对应的头文件为 <string.h>
1,测字符串长度函数 strlen
引用形式,strlen(字符数组 )
作用,strlen( )是测试字符串实际长度的函数,
它的返回值是字符串中字符的个数( 不包含 ’ \0’
的个数 )。
例:
char str[12]={“computer”};
printf(“%d”,strlen(str));
printf(“%d”,strlen(“computer”));
输出的结果都是 8
例,函数 strlen( )的使用。
#include <stdio.h>
#include <string.h>
main()
{ int i;
char str1[20],str2[20];
gets(str1); gets(str2);
for(i=0;str2[i]!='\0';i++);
printf("%s,%d\n",str1,strlen(str1));
printf("%s,%d\n",str2,i);
printf("%s,%d\n",“Good luck",strlen(“Good luck"));
}
输入,Good luck
Good luck
输出,Good luck,9
Good luck,9
Good luck,9
这两句的功能等同于函数 strlen( ),i 返回串长
2.字符串拷贝函数 strcpy
引用形式,strcpy(字符数组 1,字符串 2)
作用:将字符串 2复制到字符数组 1中。
注意:
( 1) 字符数组 1必须足够大,以便容纳字符串
2的内容。
( 2) 字符串 2可以是字符数组名或者字符串常量。当字符串 2为字符数组名时,只复制第一个’ \0’前面的内容(含’ \0’),其后内容不复制。
例,函数 strcpy( )的使用。
main( )
{int i;
char str1[20],str2[ ]=“Good luck";
char str3[20],str4[ ]=“Good luck";
strcpy(str1,str2);
for (i=0;str4[i]!='\0';i++) str3[i]=str4[i];
str1[i]='\0';
printf("str1,%s\t str2,%s\n",str1,str2);
printf("str3,%s\t str4,%s\n",str3,str4);
}
输出,
str1:Good luck str2:Good luck
str3:Good luck str4:Good luck
这两句的功能等同于函数 strcpy( )
3.字符串连接函数 strcat
引用形式,strcat(字符数组 1,字符串 2)
作用:将字符串 2的内容复制连接在字符数组 1
的后面,其返回值为字符数组 1的地址。
注意:
( 1)字符数组 1不能是字符串常量,并且必须足够大,以便可以继续容纳字符串 2的内容。
( 2)连接前字符数组 1的’ \0’将被字符串 2覆盖,
连接后生成的新的字符串的最后保留一个’ \0’。
#include <string.h>
main( )
{char str1[12]={“Good,};
char str2[ ]={“luck!”};
printf(“%s”,strcat(str1,str2));
}
例,函数 strcat( )的使用。
其状态如下:
输出,
Good luck!
G o o d \0
l u c k ! \0
G o o d l u c k ! \0
str1
str2
str1
4.字符串比较函数 strcmp
引用形式,strcmp(字符串 1,字符串 2)
作用:
比较字符串 1和字符串 2。两个字符串从左至右逐个字符比较(按照字符的 ASCII码值的大小),
直到字符不同或者遇见’ \0’为止。
如果全部字符都相同,则返回值为 0。如果不相同,则返回两个字符串中第一个不相同的字符的 ASCII码值的差,即字符串 1大于字符串 2时函数值为正,否则为负。
例,函数 strcmp( )的使用。
main( )
{char str1[ ]="abc",str2[ ]="abc";
char str3[ ]="abc",str4[ ]="abc";
int i=0;
while(str3[i]==str4[i]&&str3[i]!='\0') i++;
i=str3[i]-str4[i];
printf(“str1&str2,%d\n",strcmp(str1,str2));
printf("str3&str4,%d\n",i);
}
输出,
str1&str2,0
str3&str4,0
这两句的功能等同于函数 strcmp( )
5,strlwr(字符串 )
strlwr( )的作用是将字符串中大写字母转换成小写字母。
6,strupr(字符串 )
strupr()的作用是将字符串中小写字母转换成大写字母。
大小写转换函数:
例,编写用户登录程序
#include "string.h"
main( )
{ char username[10],name[10]="zhangsan";
gets( username );
if ( strcmp(username,name) )
printf(" Username are wrong !\n");
else
printf("You are right !\n");
puts( username );
}
例,有 3个英文字符组成的字符串,要求按照英文字母顺序输出。
#include <string.h>
main( )
{char name[3][20]={"John",“Jan","Anny"};
char str[20];
int i;
for(i=0;i<3;i++) /*字符串中所有字符转换为小写字母 */
strlwr(name[i]); /*按照英文字母顺序排序 */
if (strcmp(name[0],name[1])>0)
{strcpy(str,name[0]);
strcpy(name[0],name[1]);
strcpy(name[1],str);
}
if (strcmp(name[0],name[2])>0)
{strcpy(str,name[0]);
strcpy(name[0],name[2]);
strcpy(name[2],str);
}
if (strcmp(name[1],name[2])>0)
{strcpy(str,name[1]);
strcpy(name[1],name[2]);
strcpy(name[2],str);
}
for(i=0;i<3;i++)
printf("%s\n",name[i]);
}