C语言没有提供类似于其他语言的用于专门存放字符串的数据类型。如:Java中的String类型就是专门用来存放字符串的数据类型。在C语言中使用数组来存放字符串。
1.字符串数组的定义与使用
#include "stdio.h" void main() { char abc[15]; printf("input a string:"); scanf("%s",abc); printf("%s",abc); }
当输入是abc124a时输入输出如下表示:
input a string:abc124a
abc124a
当输入是123 abc时输入输出如下表示:
input a string:123 abc
123
注意:把一个字符数组看成字符串后,可以直接使用%s来输入输出,后面直接使用数组名。
用%s读入时,表示需要读入一个字符串到字符数组中,遇到第一个空格或回车,读入即停止。读入时还需要特别注意的是定义的字符数组的长度应该要大于读入数据的长度。
用%s输出时,要注意的是输出的是字符串的实际长度的那些字符,而不是输出定义时的字符数组的长度。如:
#include "stdio.h" void main() { char abc[5]; int i; abc[4]='K'; printf("input a string:"); scanf("%s",abc); printf("%s",abc); }
输入输出如下:
input a string:2q
2q
这个例子中,abc[]数组的第五个元素是’k’字符,但是读入这个字符串时只用到了2个元素,即
abc[0]=2
abc[1]=q
而%s输出时仅仅输出了2q这两个字符,那么字符串输出是怎么知道结束了的呢?这里会使用到一个默认的字符串结束标志字符’\0’,即此时读入时,会在末尾自动加上abc[2]=’\0’,所以输出时从字符串的头即0号元素即数组的首地址一直输出到’\0’为止,并且这个结束字符本身不会输出。再如:
#include "stdio.h" void main() { char abc[30]="abab adda"; int i; printf("%s\n",abc); for(i=0;i<30;i++) printf("%c",abc[i]); }
输入输出如下:
abab adda
abab adda
需要注意的是,这个字符串中有个空格字符,如果用到%s输入时,会怎样呢?
#include "stdio.h" void main() { char abc[30]; scanf("%s",abc); printf("%s",abc); }
输入输出如下:
abab adda
abab
因为%s读入遇到空格就结束了。
那么要怎么样才能把具有空格的字符串读入到数组中呢,比如要保存"I love this game"这个字符串,应该怎么做?
#include "stdio.h" void main() { char abc[30]="I love this game "; printf("%s\n",abc); }
第一种方法是变量赋初值。
I love this game共16个字符,但对于字符串来说,一共使用了17个空间,即
abc[0]~abc[15]共16个来存放实际的字符
abc[16]存放字符串结束标志字符’\0’
#include "stdio.h" void main() { char st[16]; int i; for(i=0;i<16;i++) scanf("%c",&st[i]); for(i=0;i<16;i++) printf("%c",st[i]); }
输入:I love this game
第二种方法是用%c读入,但是要注意范围。这里只使用了16个空间。
如果使用变量赋初值,也可以简化为这样:
#include "stdio.h" void main() { char abc[]="abdfsdfd"; printf("%s",abc); }
这个程序主要是简化了abc[]数组的大小,通过编译系统的自动处理,效果等同于
char abc[9] ="abdfsdfd";
2.字符串数组与指针
通过前面的知识,我们知道数组名表示的是这个数组的首地址,而指针变量是可以用来保存地址的。实例:程序功能:把一个字符串中的数取出来,构成一个整数。
#include "stdio.h" void main() { char abc[]="a2b1d65fd"; char *p=abc; int sum=0; printf("%s\n",abc); while(*p!='\0') { if(*p>='0' && *p<='9') sum=sum*10+*p-'0'; p++; } printf("sum=%d",sum); }
#include "stdio.h" int qushu(char *st) { int add=0; while(*st!='\0') { if(*st>='0' && *st<='9') add=add*10+*st-'0'; st++; } return add; } void main() { char abc[]="a2b1d65fd"; char *p=abc; int sum; printf("%s\n",abc); sum=qushu(abc); printf("sum=%d",sum); }
3.字符串常见函数
1) 字符串输出函数 puts
格式:puts (字符数组名)
功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示该字符串
#include "stdio.h" void main() { static char c[]="qq2009\nxulei"; puts(c); }
输出结果:
qq2009
xulei
遇到\n字符,换行处理。
注意:puts函数完全可以由printf函数取代。 当需要按一定格式输出时,通常使用printf函数。
2) 字符串输入函数gets
格式:gets (字符数组名)
功能:从标准输入设备键盘上输入一个字符串。
本函数得到一个函数值,即为该字符数组的首地址。
#include "stdio.h" void main() { char st[15]; printf("input string:"); gets(st); puts(st); }
输出结果:
input string:I love this game
I love this game
用gets函数可以获取有空格的字符串。
可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志, 而只以回车作为输入结束。这是与scanf函数不同的。
3) 测字符串长度函数strlen
格式:strlen(字符数组名)
功能:测字符串的实际长度(不含字符串结束标志‘\0’) 并作为函数返回值。
strlen函数是一个系统函数,可直接调用,返回测试字符串的实际长度。
#include "stdio.h" #include "string.h" void main() { int k; char st[]="I love this game"; k=strlen(st); printf("The lenth of the string is %d\n",k); }
输出结果:
The lenth of the string is 16
当我们用到字符串的一些库函数时,往往会使用#include "string.h"这句。
#include "stdio.h" int strlenMe(char *p) { int i=0; while(*p!='\0') { i++; p++; } return i; } void main() { char st[]="I love this game"; int k; k=strlenMe(st); printf("st的长度是%d",k); }