【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';
		else
			while (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()函数更加安全,同上面一样,它也有第三个参数,来指定拷贝字符的数量,通过这种方式,确保拷贝的数量不会超过第一个字符串长度。

字符串处理应用小程序

void SortString(void) {
	char input[LIM][MAXLENGTH];
	char* ptstr[LIM];		//char类型指针数组
	int count = 0;
	int k = 0;
	printf("Input up to %d lines, and I will sort them.\n", LIM);
	printf("To stop, press Enter key at a line's strat.\n");
	while (count < LIM && s_gets(input[count], MAXLENGTH) != NULL && input[count][0] != '\0') {
		ptstr[count] = input[count];
		count++;
	}
	sortstring(ptstr, count);
	puts("\nHere's the sorted list:\n");
	for (k = 0; k < count; k++)
		puts(ptstr[k]);

}

void sortstring(char *strings [], int num) {
	char* temp = NULL;
	int top = 0, seek = 0;
	for (top = 0; top < num - 1; top++) {
		for (seek = top + 1; seek < num; seek++) {
			if (strcmp(strings[top], strings[seek]) > 0) {
				temp = strings[top];
				strings[top] = strings[seek];
				strings[seek] = temp;
			}
		}
	}
}

该程序会根据语句单词字母排序,有趣的是,如果首字母大写,会出现在首字母小写的前面。例如句子开头是H,和句子开头是a,H开头句子会被放在a前面。这是因为ASCII码H在a前。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SUNX-T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值