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

编程入门 行业动态 更新时间:2024-10-20 05:39:58

【C++ 学习】<a href=https://www.elefans.com/category/jswz/34/1771434.html style=字符串处理函数(strlen等)"/>

【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()函数比较的是字符串,不是字符 ,这一点是很重要的。

#define MAXLENGTH 81
#define LIM		20
#define STOP	"quit"
void Show_strcmp(void) {char input[LIM][MAXLENGTH];int ct = 0;printf("Enter up to %d lines (type quit to quit): \n", LIM);while (ct < LIM && s_gets(input[ct], MAXLENGTH) != NULL && strcmp(input[ct], STOP) != 0) {ct++;}printf("%d strings entered\n", ct);}char* s_gets(char *str, int size) {char* ret_val;int i = 0;ret_val = fgets(str, size, stdin);if (ret_val) {while (str[i] != '\n' && str[i] != '\0') i++;if (str[i] == '\n')str[i] = '\0';elsewhile (getchar() != '\n')continue;}return ret_val;
}

该段程序允用户输入最多20条字符串,每条字符串最大容量是81,当用户想要结束时,只需要输入quit即可退出程序。

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

strcpy()、strncpy()函数

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

字符串处理应用小程序

更多推荐

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

本文发布于:2023-12-07 07:51:30,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1670589.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:字符串   函数   strlen

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!