关于字符串.docx
《关于字符串.docx》由会员分享,可在线阅读,更多相关《关于字符串.docx(14页珍藏版)》请在冰豆网上搜索。
关于字符串
C++之字符数组和字符串
字符数组的初始化
字符串的输入输出
综合举例
字符数组和字符串的概念
字符数组是元素类型为字符的数组,它既具有普通数组的一般性质,又具有某些特殊性质。
字符串常量是用双引号包围的字符序列。
存储字符串常量时,系统会在字符序列后自动加上'\0',标志字符串的结束。
字符串的长度定义为字符串中的有效字符数,不包括结束标志'\0'和双引号。
字符串变量是以'\0'作为结束标志的字符数组。
字符串变量用于存储和处理字符串常量。
在书中统称为字符串的,既可能是字符串常量也可能是存储了字符串常量的字符串变量,即特殊的字符数组。
字符数组有两种用法:
一是当作字符的数组来使用。
这时的用法与整数的数组、 实数的数组等相同,对字符数组的输入、输出、赋值、引用等都是针对单个的元素进行。
二是更为重要的用法即存储、处理字符串。
这时它除了可以像普通数组一样使用外,还可以把字符串作为一个整体进行操作。
1.字符数组的初始化
(1)用字符对字符数组初始化 这时把字符数组当作普通数组看待,产生的数组不会有结束符'\0'。
当数据量很大时,使用这种方法的工作量是繁重的。
例:
charrat[5]={'H','E','L','L','O'};
(2)用字符串常量对字符数组初始化,这时把字符数组当作字符串变量看待。
例:
charpanic[6]={"HELLO");
这时存放在数组panic中的字符除了H,E,L,L,O之外还有结束标志'\0',因此与下面的初始化等价:
charpanic[6]={'H','E','L','L','O'};
注意:
第二个说明语句中有6个字符,因此字符数组panic的长度是6,而字符串"HELLO"的长度却是5,不把'\0'计算在内。
C语言也允许在用字符串初始化时省略花括号。
charpanic[]="HELLO";
如果在说明语句中指定了数组的长度,那么其大小不得小于初始化字符串的长度。
多余的元素位置被系统自动初始化为0。
实际上'\0'就是ASCII码为0的字符,因此'\0'和整数0是一回事。
例:
charposia[11]="string";
下面的初始化却是错误的:
charneg[5]="doublearrow";
3)字符数组两种不同用法举例
在前面已经说明,字符数组既可当作普通数组使用也可用于存储和处理字符串.下面是对应两种用法的例子。
例:
字符数组用法示例之一,当作普通数组。
#include
#defineSIZE10
main()
{
charary1[SIZE]={'P','L','O','T'};
charary2[SIZE];
charch;
inti,j;
for(i=0;i<4;i++)
printf("%c",ary1[i]);
printf("\n请输入一行字符\n");
for(i=0;i{
scanf("%c",&ch);
if(ch=='\n')
break;
ary2[i]=ch;
}
printf("\n");
for(j=0;j
printf("%c",ary2[j]);
}
程序中为了处理数组使用了循环,并且使用了ch,i,j等工作变量,增加了程序的负担,而且又缺乏灵活性,故这种方法很少使用。
与下面完成同样功能的程序相比,本程序复杂多了。
例:
字符数组用法之二,当作字符串。
#include
#defineSIZE10
main()
{
charary1[SIZE]="PLOT";
charary2[SIZE];
printf("%s\n",ary1);
printf("请输入一行字符:
\n");
scanf("%s",ary2);
printf("输入字符串是:
\n");
printf("%s",ary2);
}
程序没有用循环,只是直接调用scanf和printf函数完成输入输出。
程序之所以能够自动识别出字符串有几个字符,是因此规定了字符串必须以'\0'作为结束,像printf之类的函数输出字符串时一边检测一边输出,一旦碰到'\0',便认为字符串已经结束,之后就停止工作。
这样一来'\0'对整个字符串来说至关重要了。
一旦由于某种原因字符串的'\0'被改为别的值,字符串就无法终止,printf函数就不能正常工作了。
请注意printf和scanf函数处理字符串数组的特点。
直接使用数组名作为参数。
例:
printf("%s\n",ary1);
这种直接使用数组名的用法表示把字符串数组当作一个统一整体来处理,只适用于字符串,对别的类型的数组是不能这样用的。
2.字符串的输入输出
2.1字符串的输入
scanf函数
用带%s格式符的scnaf函数可以进行字符串的输入。
在使用中要注意两个问题:
一是scanf函数读入的字符串开始于第一个非空白符,包括下一个空白符('\n','\t','')之前的所有字符,最后自动加上‘\0'。
例:
charstr[10];
scanf("%s",str);
输入:
helloworld
实际存入str的只有"hello",前面的空格被忽略掉,而"world"被留在输入缓冲区中等待下一次输入函数的读入。
二是要保证字符数组的长度足够大,能容纳下可能的最大输入串。
例:
chart[5],s[10];
scanf("%s",t);
输入:
dingdong
则字符串"dingdong"不仅存入了t的空间,还侵占了s的空间。
gets函数
gets函数专门用于输入字符串,一般形式是:
gets(字符数组名);
其中,函数参数"字符数组名"规定了只能使用数组名而不能是字符串常量。
与scanf函数不同,gets函数将用户键入的换行符之前的所有字符(包括'\t'和'')存入字符数组,然后加上'\0',但换行符被丢掉。
与scanf函数相同的是gets函数也不检查用户输入字符串长度是否超过了字符数组的容纳能力,因此编程者要确保数组足够大。
例:
charstr[11];
gets(str);
输入:
Iamaboy
2.2字符串输出
printf函数
用带%s格式字符的printf函数能进行字符串的输出。
存放在字符数组中的字符串被全部输出,直至遇到'\0'为止。
例:
charmsg[]="T0beornottobe";
printf("%s",mag);
puts函数
puts函数专门用于字符串输出。
一般形式是:
puts(字符串);
其中,参数"字符串"可以是字符串常量,也可以是字符串变量。
puts函数打印字符串的全部内容,直至遇到'\0'为止,然后自动多打印一个'\n',起到换行的作用。
而printf函数无此功能。
到底应该使用scanf和printf还是使用gets和puts,没有一个绝对的标准。
一般而言,当多种类型的混合输入输出时,选用scanf和printf; 当大量文字信息输入输出时,使用gets和puts,这两个函数要稍稍快一些。
3.字符串处理函数
介绍最有用又最常见的四个字符串处理函数:
strlen、strcat、strcmp、strcpy。
这些函数的原型存放在string.h文件中,在程序中使用它们时别忘了用#include命令包含string.h文件。
strlen函数
strlen函数测试字符串的实际长度(不包括'\0'),并将该长度作为函数的值返回。
函数参数“字符串”可以是字符串常量,也可以是字符变量一般形式是:
length=strlen(字符中)
例:
"ABC"长度为3。
"abc\n"长度为4,而非5,'\n'被看成一个字符。
""长度为0,空字符串没有有效字符,所以长度为0。
strcat函数
strcat函数用于连结两个字符串。
一般形式是:
strcat(字符串1,字符串2);
strcat函数把字符串2连结在字符串1的后面。
其中,参数“字符串1"必须是字符串变量,而"字符串2"则可以是字符串常量或变量。
调用strcat函数后,str1中字符后的'\0'取消,只在新串最后保留一个'\0'。
注意:
strcat函数不检查字符串1的空白位置是否装得下字符串2。
如果没有足够的空间,多余的字符将溢出至邻近的内存单元,破坏这些单元原来的内容。
所以连结前应调用strlen函数进行检验,确保不发生溢出。
记住在检验时给长度加1,为新字符串的结束符'\0'留一个位置。
例:
strcat函数示例。
staticcharstr1[30]={"Pelple'sRepublicof"};
staticcharstr2[]={"China"};
printf("%s",strcat(str1,str2));
输出:
Pelple'sRepublicofChina
strcmp函数
strcmp函数是比较两个字符串的大小,返回比较的结果。
一般形式是:
i=strcmp(字符串,字符串);
其中,字符串1、字符串2均可为字符串常量或变量;i是用于存放比较结果的整型变量。
比较结果是这样规定的:
①字符串1小于字符串2,strcmp函数返回一个负值;
②字符串1等于字符串2,strcmp函数返回零;
③字符串1大于字符串2,strcmp函数返回一个正值;那么,字符中的大小是如何比较的呢?
来看一个例子。
实际上,字符串的比较是比较字符串中各对字符的ASCII码。
首先比较两个串的第一个字符,若不相等,则停止比较并得出大于或小于的结果;如果相等就接着比较第二个字符然后第三个字符等等。
如果两上字符串前面的字符一直相等,像"disk"和"disks"那样,前四个字符都一样,然后比较第五个字符,前一个字符串"disk"只剩下结束符'\0',后一个字符串"disks"剩下's','\0'的ASCII码小于's'的ASCII码,所以得出了结果。
因此无论两个字符串是什么样,strcmp函数最多比较到其中一个字符串遇到结束符'\0'为止,就能得出结果。
注意:
字符串是数组类型而非简单类型,不能用关系运算进行大小比较。
if("ABC">"DEF")
if(strcmp("ABC","DEF")
strcpy函数
strcpy函数用于实现两个字符串的拷贝。
一般形式是:
strcpy(字符串1,字符串2)
其中,字符串1必须是字符串变量,而不能是字符串常量。
strcp