int main() {
char A[200], B[200];
printf("Enter 2 words or sentences.\n");
gets(A);
gets(B);
char* C = (char*)malloc((strlen(A) + strlen(B)) * sizeof(char));
for (int i = 0; i < strlen(A); i++)
C[i] = A[i];
for (int i = 0; i < strlen(B); i++)
C[i + strlen(A)] = B[i];
printf("%s", C);
}
C
的初始值是ÍÍÍÍÍÍÍÍÍÍýýýý
,比请求的长4个符号,并且在打印C
时这4个符号也显示为输出。我不知道为什么会有4个符号,这就是为什么我在这里寻求解释。
3条答案
按热度按时间vxqlmq5t1#
问题:
非 * 空字符 * 终止
代码尝试
printf("%s", C);
,这是 * 未定义的行为 *,因为C[]
不是"%s"
所需的 * 字符串 *。分配的内存不足
为 * 空字符 * 腾出空间。
自C11以来,
gets()
不再是标准C库的一部分使用
fgets()
并删除可能的尾随'\n'
以获得类似的行为。int
与size_t
的比较int
不足以处理非常长的字符串。size_t
适用于所有字符串。避免可能重新计算字符串长度
b09cbbtk2#
malloc
只返回一个指针,指向它分配给你的内存,它不会初始化内存,或者清零,或者类似的操作,所以当你打印出来的时候,你看到的是之前的垃圾。坦白地说,你很幸运没有打开一个虫洞或其他什么东西,C字符串是空终结的,所以当你传递指针时,从技术上讲你还没有传递字符串,当你把它传递给一个期望字符串的函数时,各种各样的古怪行为都会随之而来。
您应该在获得内存时对其进行初始化。最简单的初始化是类似于
*C = '\0';
或C[0] = '\0';
,这会将内存转换为零长度字符串。但是您可能已经有一些内容要放在那里了,或者您一开始为什么要分配内存?:P现在有了代码,我们可以稍微调整一下来解决这个问题...
emeijp433#
C[strlen(A) + strlen(B)] = '\0';
在malloc
摆脱了垃圾之后,感谢大家的想法。