由于字符串使用广泛,C/C++提供了一些字符串处理函数,使得用户能很方便地对字符串进行处理。这些函数是在cstring头文件中声明的。如果程序中使用这些字符串函数,应该包含头文件cstring
1.字符串连接函数strcat
原型:char *strcat(char *dest, const char *src);
功能:第1个参数dest是目标字符串,第2个参数src是源字符串,把src所指向的字符串连到dest所指向的字符串后面
返回值:返回连接后所得到的字符串的首地址,即第1个参数dest的值
说明:①第1个参数所指向的存储空间必须足够大(足以容纳这两个字符串)
②连接前,两串均以'\0'结束;连接后,dest字符串原先的'\0'取消,在新的dest字符串最后加'\0'
注意,strcat函数和strcpy函数的返回值都是字符指针,而且是目标字符串的指针,返回这个指针有什么好处?答案:返回目标字符串的指针,这样可以直接把函数执行结果输出来;甚至可以把函数执行结果放到表达式里参与运算,或者作为其他函数的参数
char s1[20] = "Welcome to";
char s2[] = "C/C++!";
cout << strcat(s1, s2) << endl; //将s2连接到s1,输出连接后的s1:Welcome to C/C++!
2.字符串复制函数strcpy和strncpy
原型:char *strcpy(char *dest, const char *src);
功能:第1个参数dest是目标字符串,第2个参数src是源字符串,把src所指向的字符串拷贝到dest所指向的存储空间里,将原有的字符覆盖
返回值:返回拷贝后所得到的字符串的首地址,即第1个参数dest的值
说明:①第1个参数所指向的存储空间必须足够大(足以容纳第2个字符串)
②拷贝时'\0'一同拷贝过去
char s1[20] = "Welcome to C/C++!";
char s2[] = "C/C++!";
cout << strcpy(s1, s2) << endl; //将s2拷贝到s1,输出结果为:C/C++!
如果不想拷贝src整个字符串,可以指定拷贝的字符数,需要使用strncpy函数。strncpy函数的原型为:char *strncpy(char *dest, const char *src, size_t n);
strncpy函数比strcpy☒函数多了参数n,用来指定拷贝的字符数
注意:strncpy函数在将源字符串中的n个字符拷贝到目标字符串后,不会在目标字符串末尾加上串结束标记'\0',这个细节上的差别可能会导致程序输出奇怪字符甚至导致程序运行结果不正确。如下面的例子:
char s1[20] = "Hello world!"; char s2[20];
strncpy(s2, s1, 5); //拷贝后,s2中存储了"Hello",但后面没有串结束标记
cout << s2 << endl; //输出Hello,后面还有一些奇怪的字符
解决上述问题的方法是:在调用strncpy函数前将目标字符串清空,即将所有元素的值置为0。对上面的程序,可以按下面方式定义s2数组
char s2[20]= {0};
3.字符串长度函数strlen
原型:unsigned int strlen(const char *string);
功能:计算字符串长度,即从指定位置开始到第一个'\0'前的字符个数
返回值:返回字符串实际长度,不包括'\0'在内
char s1[20] = "Welcome to C/C++!";
char s2[] = "C/C++!";
cout << strcpy(s1, s2) << endl; //将s2拷贝到s1
cout << strlen(s1) << endl; //输出:6
4.字符串比较函数strcmp和strncmp
原型:int strcmp(const char *s1,const char *s2);
功能:比较两个字符串的大小
比较规则:对两字符串从左向右逐个字符比较(ASCII码),直到遇到不同字符或'\0'为止
返回值:返回int型整数,若字符串s1<字符串s2,返回-1;若字符串s1>字符串s2,返回1;若字符串s1==字符串s2,返回0。注意,用strcmp函数比较两个字符串s1和s2,返回值如果为0,就表示s1和s2是同一个字符串
cout << strcmp("aba", "abAc") << " ";
cout << strcmp("abca", "abcd") << " ";
cout << strcmp("abcd", "abcd") << endl; //输出:1 -1 0
如果不想比较到字符串末尾,可以指定比较的字符数,需要使用strncmp函数。strncmp函数的原型为:
int strncmp (const char *s1,const char *s2,size_t n )
strncmp函数比strcmp函数多了参数n,用来指定比较的字符数,比较的规则和返回值含义和strcmp函数一样
5.存储空间赋值函数memset
原型:void *memset(void *dest, int c, int count);
功能:把空类型指针变量dest所指向的存储空间的前count个字节设置成整数c。memset函数可以实现快速为一个整型或char型数组各元素初始化为0或-1(但其他初始值不行),用法如下:
返回值:返回值就是参数dest所指向的存储空间的地址。
int a[100]; memset(a, 0, sizeof(a)); //将数组a各个元素赋值为0
int b[100]; memset(b, 0xff, sizeof(b)); //将数组b各个元素赋值为-1
6.存储空间拷贝函数memcpy
原型:void *memcpy(void *dest, const void *src, size_t count);
功能:把空类型指针变量src所指向的存储空间前count个字节的内容拷贝到空类型指针变量dest所指向的存储空间
返回值:返回的就是参数dest所指向的存储空间的地址
例如,以下代码将数组的内容拷贝到数组b:
int a[10] = {0,1,2,3,4,5,6,7,8,9}, b[10];
memcpy(b,a,sizeof(a));
因此,memcpy函数可以快速地将一个数组的内容备份到另一个数组