2014-07-08 51 views
-7

对于以下代码,我添加了两个printf语句来测试两个字符串是否被正确读取。然而,当我输入类似:abcabcabcza,CB 的输出:使用getchar()读取两个字符串

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”以便printf知道停止打印的位置。 temp3 []和temp4 []具有未定义的值。 – bestalign

+0

你能详细解释一下吗?我怎样才能防止这一点? – Jobs

+0

用0填充temp3 []和temp4 [] 0 – bestalign

回答

4

您需要在打印前串终止'\0'添加到您的字符串(或第一零出缓冲区的内存)。

另外:你已经声明了大小为20的缓冲区,但是在你的代码中没有守卫来尊重分配的长度,这意味着你可以超越它们并损坏内存。 [以大于20个字符的两个单词运行...]

1

'\ n'和'\ 0'在此处不同。您需要在字符串的末尾添加'\ 0',因为printf会打印出字符串,直到遇到'\ 0'。 C不会初始化数组。如果你没有手动初始化,它会有垃圾值。

我会做:

char temp3[20] = {0}; 
char temp4[20] = {0}; 

填写TEMP3和TEMP3 0,这是一样的 '\ 0'。

+3

('temp3 [20] = 0;')不好;最大的有效下标是'temp3 [19]'等。即使是这样,固定它,它是在马被闩上后将马厩锁上。有超过字符串的问题 - 或没有检查,以确保它不会发生。 –

1

C中的字符串需要以NULL结尾。 许多函数使用终止符来宣告字符串结束的处理器。

如果未终止,会发生什么?让我们得到一个简单的字符串,消耗5个字节的内存。

...[?][?][H][e][l][l][o][?][?][?]...

这导致泄漏。正如你看到的,我们没有存储NULL。它会导致u/b,并且在任何新的运行中你可能会得到不同的标志。对于我们来说,处理器会将字符串放入随机的内存块中。不过,默认情况下gcc有优化来防止这种情况。

1

当你给一个字符串“ABC”,它会被保存为“ABC \ 0”,所以检查\ 0也和不打印