使用getchar()读取两个字符串

时间:2014-07-08 00:02:06

标签: c

对于以下代码,我添加了两个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);

4 个答案:

答案 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并且不要打印它