对于以下代码,我添加了两个printf语句来测试是否正确读取了两个字符串。但是,当我输入类似的内容时:abcabcabcza,cb 输出是:
abcabcabcza▒
CB9
有谁知道第一个字符串末尾的符号和第二个字符串末尾的“9”来自何处?非常感谢你!
printf("\nEnter two words, seperated by a comma: ");
int temp1, temp2, index3, index4; char temp3[20], temp4[20];
index3=index4=0;
while((temp1 = getchar())!= ','){
temp3[index3++] = temp1;
}
printf("\n%s", temp3);
while((temp2 = getchar())!= '\n'){
temp4[index4++] = temp2;
}
printf("\n%s", temp4);
答案 0 :(得分:4)
您需要在打印前向字符串添加字符串终止符'\0'
(或先将缓冲区内存清零)。
另外:你已经声明了大小为20的缓冲区,但是你的代码中没有保护来尊重分配的长度,这意味着你可能会超出它们并破坏内存。 [用两个大于20个字符的单词运行...]
答案 1 :(得分:1)
' \ n'和' \ 0'这里有所不同。你需要添加' \ 0'在字符串的末尾,因为printf打印出字符串,直到遇到' \ 0'。 C不会初始化数组。如果不手动初始化,则会产生垃圾值。
我愿意:
char temp3[20] = {0};
char temp4[20] = {0};
用0填充temp3和temp3,与' \ 0'相同。
答案 2 :(得分:1)
C中的字符串需要以NULL结尾。 许多函数使用终结符来通知字符串结束的处理器。
如果没有终止,hapan将会是什么?让我们得到一个简单的字符串,消耗5个字节的内存。
...[?][?][H][e][l][l][o][?][?][?]...
导致泄漏。如你所见,我们还没有存储NULL。它导致u / b,你可能会在任何新的运行中得到不同的标志。对我们来说......处理器将字符串放在随机的内存块中。但是,默认情况下,gcc具有防止这种情况的优化。
答案 3 :(得分:1)
当你给一个字符串作为' abc'它将被保存为' abc \ 0',因此请检查\ 0并且不要打印它