(八)字符串

最后更新于:2022-04-01 20:17:43

字符串是一种重要的数据类型,但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 #include 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 #include 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);
';