【C语言日日练(八)】字符串

【C语言天天练(八)】字符串

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