3.3.6 C风格字符串处理函数

    作为一种特殊类型的字符数组,C风格字符串可以使用cout和cin做整体的输入输出,但是,其他整体操作,如赋值、比较和连接等都是不允许的,如下所示。


    char x[10],y[10]="ABCDEFGHI"; x="123456789";//错误 x=y;//错误 if(x<y)//错误 {……} x+=y;//错误

    和普通数组一样,原则上,这些操作都必须逐个对字符串中的元素进行操作,但为了方便程序员对C风格字符串进行处理,系统提供了相应的库函数来完成这些操作,标准头文件cstring(旧标准中为string.h)提供了很多相关函数的声明,常用的字符串处理函数如表3.1所示。

    3.3.6 C风格字符串处理函数 - 图1

    注意

    char*指的是函数返回值是字符指针型,关于指针的详细介绍请参考第4章。实际上,用指针处理C风格字符串是很多函数经常采用的方式,第4章会探讨数组名和指针的关系以及这些C风格字符串处理函数的写法,本节讨论的仅是这些函数的用法。函数中的数组,指的都是最后一个元素是空字符的字符数组,即C风格字符串。

    C风格字符串处理函数使用范例如代码3.8所示。

    代码3.8 C风格字符串处理函数使用范例C-StringFunctionSample


    <————————————————文件名:example308.cpp——————————-> 01 #include<iostream> 02 #include<cstring> 03 int main() 04 { 05 using namespace std; 06 char password[]="CHINA";//创建字符数组,用字符串常量初始化,大小为6 07 char input[6],copyInput[6]; 08 char catInput[]="I LOVE";//创建字符数组,用字符串常量初始化,大小为7 09 cout<<"请输入密码(不超过5位):"<<endl; 10 cin>>input; 11 cout<<"你输入的密码位数为:"<<strlen(input)<<endl;//长度计算 12 cout<<"转换成大写形式:"<<strupr(input)<<endl;//全部转换成大写形式 13 if(strcmp(strupr(input),password)==0)//比较两个字符串是否相等 14 cout<<"密码正确"<<endl; 15 strcpy(copyInput,input);//复制函数 16 cout<<"执行字符串复制操作后:"<<copyInput<<endl; 17 strcat(catInput,input);//拼接函数,将input接在catInput后 18 cout<<"执行字符串连接操作后:"<<catInput<<endl; 19 return 0; 20 }

    【代码解析】代码第11行是调用strlen()函数计算字符串长度;代码第12行是调用strupr()函数将全部的字符转换成大写形式;代码第13行是调用strcmp()函数进行字符串比较;代码第15行是调用strcpy()函数进行函数复制;代码第17行是调用strcat()函数将两个字符串拼接在一起。

    输出结果如下所示。


    请输入密码(不超过5位): china(注:键盘输入) 你输入的密码位数为:5 转换成大写形式为:CHINA 密码正确 执行字符串复制操作后:CHINA 执行字符串拼接操作后:I LOVE CHINA

    代码3.8 演示了如何使用库函数来处理C风格字符串,cstring头文件中有更多处理函数的声明,在需要对字符串进行操作时,请尽量使用库函数。

    C++通过添加string类扩展了C++库。现在不仅仅可以使用字符数组来处理字符串,还多了一种选择—使用string类型的对象。之所以一直强调“C风格字符串”,主要是为了与功能更强大的string对象进行区分,关于这方面的详细内容,请参考第18章。