11.7 攻略字符串拼接的重要问题

发布于 16 天前  19 次阅读


OK,let's look at my greatness !

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main() {
	char str1[999];
	fgets(str1,999, stdin);
	char str2[999];
	fgets(str2,999, stdin);
	char str3[999] = {0};
	strcpy(str3,str1);
	int a = strlen(str2);
	for (int i = 0; i < a; i++) {
		str3[strlen(str1)-1+ i] = str2[i];
	}
	for (int i = 0; i < strlen(str3)-1; i++) {
		printf("%c",str3[i]);
	}
	return 0;
}

真的花了点时间呀,不过值得

第一点,从int a = strlen(str2);开始出现问题

定义的时候给出了str1和str2很大的内存大小(999)

这就导致(测试点不至于超过999这么变态吧?)两次fgets都不会舍命陪君子,换行符都会被保留,当然,字符结束符\0肯定伴你同行

那么问题来了,strlen这孩子很懂事,它不会计算\0的占用情况,所以结果是包含换行符在内的字符串数量

我们知道,正常情况下,str[strlen(str)]是字符结束符的存储地方

//这句话很重要,这里说的是仅是字符数组的情况(md,废话,strlen就只能用于字符数组)

因为数组下标从0开始,strlen的数值不包含\0,这正好构成了这个情况

str3[strlen(str1)-1+ i] = str2[i];

所以这一步,我们要想替换字符结束符和换行符,本质是考虑替换换行符,应该字符结束符在后面,只要实现了换行符替换的操作就自然大功告成了

strlen( str1 )是字符结束符,那么换行符就应该还要减一,这就是为什么要加上-1的原因!!!


下次抽空再谈谈strcat函数,bye

届ける言葉を今は育ててる
最后更新于 2024-11-08