【C++ 学习】字符串处理函数(strlen等)

字符串处理函数(strlen等)

C库提供了很多字符串处理函数,这些函数主要放在string.h头文件中。本文主要记录strlen()、strcat()、strcmp(),strncmp()、strcpy()、strncpy()等函数。

strlen()函数

strlen()函数用来统计字符串长度。

void Show_strlen(void) {
	char msg[] = "Things should be as simple as possible,"
		" but not simpler.";		//这种声明方式比较简单
	puts(msg);
	printf("The length of string: %d.\n", strlen(msg));  // 使用strlen函数来统计字符串长度
	for (int i = 0; i < strlen(msg); i++) {
		printf("%c", msg[i]);
	}
}

可以通过该函数来控制字符串输出长度。

strcat()函数、strncat()函数

strcat()函数用于拼接字符串,函数接受两个参数,两个参数均为字符串。strcat(str1, str2),该函数将第二个字符串str2的副本附加在第一个字符串末尾,并将拼接后的形成的字符串作为第一个字符串,第二个字符串不变,该函数返回第一个字符串的首地址。

void Show_strcat(void) {
	char str1[MAXLENGTH] = "Things should be as simple as possible, ";
	char str2[MAXLENGTH] = "but not simpler.";
	puts(str1);
	puts(str2);
	printf("The length of string 1: %d.\n", strlen(str1));
	printf("The length of string 2: %d.\n", strlen(str2));
	printf("address of str1: %p, address of str2: %p", str1, str2);
	strcat(str1, str2);
	puts(str1);
	printf("The length of string 1: %d.\n", strlen(str1));
	printf("address of str1: %p, address of str2: %p", str1, str2);
}

在VS2022中输入以上代码,程序会报一个错误

error C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>已完成生成项目“StringLearn.vcxproj”的操作 - 失败。

并不是所有的编译器都会报如上的错误,VS也可以忽略这个错误进行编译,strcat()函数被认为存在安全问题,原因在于strcat()函数在拼接的时候,并没有考虑第一个字符串的内存大小,当将第二个字符串拼接在第一个字符串后面时,可能会出现超过一个字符串的存储空间,进而擦出了内存空间其他位置的数据。

所以提出了strncat()函数,该函数较strcat()函数增加了第三个参数,该参数指定了最大添加字符数。

void Show_strncat(void) {
	char str1[MAXLENGTH] = "Things should be as simple as possible, ";
	char str2[MAXLENGTH] = "but not simpler.";
	puts(str1);
	puts(str2);
	printf("The length of string1 : %d.\n", strlen(str1));
	printf("The length of string2 : %d.\n", strlen(str2));
	printf("address of str1: %p,      address of str2: %p\n", str1, str2);
	strncat(str1, str2, sizeof(str1) - strlen(str1));
	puts(str1);
	printf("The length of string1 : %d.\n", strlen(str1));
	printf("address of str1: %p, address of str2: %p\n", str1, str2);
}

strncat(str1, str2, sizeof(str1) - strlen(str1)); 代码中使用sizeof(str1) - strlen(str1)来传入最大拼接字符数。

strcmp()、strncmp()函数

strcmp()函数专门用来比较字符串内容是否一致。简单使用对字符串使用==来比较是错误的行为,

	char str1[MAXLENGTH] = "Things should be as simple as possible, ";
	char str2[MAXLENGTH] = "Things should be as simple as possible, ";
	if (str1 == str2){
		printf("equal!\n")
	}

程序永远也无法输出equal,原因在于==比较的是两个字符串的首地址,str1和str2的首地址是不相同的。

strcmp()函数比较的是字符串,不是字符 这一点是很重要的。

strncmp()函数和strcmp()函数很相似,但是比strcmp()函数增加了第三个参数,该参数指明要比较两个字符串的长度,通过该函数,可以比较两个字符串前几位的长度,例如,查字典就是这种方式。

strcpy()、strncpy()函数

strcpy()函数是拷贝函数。字符串存在一个深拷贝和浅拷贝的问题。如果简单的使用字符串名来给另外一个字符串赋值,会造成浅拷贝的问题,str1 = str2,这样str1只是指向了str2,并不是真的生成了str2的副本给str1。
strcpy()函数解决了这个问题,其有两个参数,第一个参数为生成的副本des,第二个参数为源字符串src,将src中的内容拷贝到des中,要注意des需要有足够大的空间来存储副本,否则会发生安全问题。
strcpy函数也有返回值,其返回类型为char *,即第一个参数的地址。
strncpy()函数更加安全,同上面一样,它也有第三个参数,来指定拷贝字符的数量,通过这种方式,确保拷贝的数量不会超过第一个字符串长度。

你可能感兴趣的:(C++学习,c++,学习)