字符串是一种重要的数据类型,但C语言中没有显式的字符串数据类型。头文件string.h中包含了大多数对字符串的操作函数。因此,有字符串的操作时,一般会包含string.h头文件。
1、字符串的长度:对字符串进行的操作中,经常要对它进行求长度的操作。字符串的长度就是它所包含的字符个数。size_t strlen(char const *string);
注意:strlen返回一个类型为size_t的值,它是一个无符号整数类型。在表达式中使用无符号数可能导致不可预料的结果。
如下面两条表达式并不相等:
if(strlen(x) >= strlen(y)) .... /*按照预想的那样工作*/
if(strlen(x) - strlen(y) >= 0).../*永远为真,strlen的结果是个无符号数,所以操作符>=左边的表达式也将是无符号数*/
size_t strlen(char const *string) { int length; for(length = 0; *string++ != '\0';) length++; return length; }2、复制字符串:用于复制字符串的函数时strcpy,原型如下:char *strcpy(char *dst, char const *src); 它把参数src字符串复制到dst参数。dst参数的以前内容将被覆盖掉并丢失。即使新的字符串比dst原先的内存更短,由于新字符串以NUL字节结尾,所以老字符串最后剩余的几个字符也会被有效地删除,(其实并为被删除,可以使用地址访问)。
我们必须确保目标字符数组的空间足以容纳需要复制的字符串。如果字符串比数组长,多余的字符仍被复制,它们将覆盖原先存储于数组后面的内存空间的值。在使用该函数前确保目标参数足以容纳源字符串,就可以避免大量的调试工作。
#include <string.h> #include <stdio.h> int main(int argc, char **argv) { char message[] = "Original message"; printf("%c.\n", message[2]);//结果是Original中的i strcpy(message, "Different"); printf("%s.\n", message);/*结果是Different,后面的message因为NUL的原因未显示*/ printf("%c.\n", message[2]);//结果是Different中的f printf("%c.\n", message[12]);//结果是message中的s return 0; }3、连接字符串:把一个字符串添加(连接)到另一个字符串的后面。原型:char *strcat(char *dst, char const *src); 该函数要求dst参数原先已经包含了一个字符串,它找到这个字符串的末尾,并把src字符串的一份拷贝添加到这个位置。同样应该确保目标字符数组剩余的空间足以保存整个源字符串。
#include <string.h> #include <stdio.h> int main(int argc, char **argv) { char message[100]; strcpy(message, "Hello "); strcat(message, "World.\n"); printf("message = %s",message); return 0; }注意:strcpy和strcat函数都返回它们第1个参数的一份拷贝,就是指向目标字符数组的指针。在实际应用中,它们的返回值经常只是简单的被忽略。
4、字符串比较:比较两个字符串涉及对两个字符串对应的字符逐个进行比较,直到发现不匹配为止。
原型:int strcmp(char const *s1, char const *s2);
如果s1小于s2,返回值小于0;
如果s1大于s2,返回值大于0;
如果s1等于s2,返回值等于0;
5、其他字符串函数
char *strncpy(char *dst, char const *src, size_t len);向dst写入len个字符。如果strlen(src)的值小于len,dst数组就用额外的NUL字节填充到len长度。如果strlen(src)的值大于或等于len,那么只有len个字符被复制到dst中。注意,它的结果将不会以NUL字节结尾。
char *strncat(char *dst, char const *src, size_t len);
intstrncmp(char const *s1, char const *s2, size_t len);