为什么这个奇怪的输出在c?

问题描述:

我有以下程序为什么这个奇怪的输出在c?

#include <stdio.h> 

main() 
{ 

    char ch[10]; 

    gets(ch); 

    printf("\nTyped: %s\n\n", ch); 

    int i = 0; 
    while (ch[i] != '\0') 
    { 
     printf("Letter: %c\n", ch[i]); 
     i++; 
    } 

    printf("\nTyped: %s\n\n", ch); 


} 

,这里是输出的时候我输入的“Hello world好”

hello world is good 

Typed: hello world is good 

Letter: h 
Letter: e 
Letter: l 
Letter: l 
Letter: o 
Letter: 
Letter: w 
Letter: o 
Letter: r 
Letter: l 
Letter: 


Typed: hello worl♂ 

为什么我while循环之后得到了相同的命令两个不同的输出?不while循环有什么关系呢..请帮助..

+0

好吧,你有一方面的大教堂,另一方面是奇怪的:^) –

+1

不要使用'gets'! **从来没有!** –

你的字符数组ch只有10个字符的空间。你输入了超过10个字符的东西,并试图将其存储在该数组中,有效地将超出数组末尾的空间写入没有预留给任何东西(或者至少不会保留给你的字符)的空间中。你有在这种情况下,幸运地在任何重要的东西没有写(您的程序没有崩溃),但随后的代码来走过(printf(),你int i等)和变化内存(它的堆栈,毕竟,所以它以FIFO顺序使用)。

更改char ch[10]char ch[2048]给自己一个更大的缓冲区来键入。您也可以使用fgets()而不是gets(),这样您可以将输入大小限制为缓冲区大小。如果你使用gets(),听取手册页上的警告:

这是调用者的责任,以确保输入线,如果 任何,足够短,以适应的字符串中。

+0

谢谢,这是非常有益的感谢大家.... – srisar

你知道的“Hello world好”超过10个字节?在这种情况下的行为是undefined。任何事情都可能发生,无论如何,从你的工作想要到您的系统的总崩溃与重新格式化硬盘驱动器和燃烧的垃圾通过您的ROM。

必须为gets分配足够的空间放于字符串,在这种情况下你不知道。这是为什么gets应该避免的主要原因,请使用fgets来代替。

+1

我很感激downvoter的评论,谢谢 – littleadv

好了,你只分配10个字符(char ch[10]),这符合 “你好WORL”。之后,你只是在尝试打印内存中的垃圾。

+1

这是为什么downvoted? – Blender

+0

但是为什么当它立即被调用时打印出来,而不是在while循环之后?这是我的问题... 10个字节是有目的地做了测试这..可以帮助你现在 – srisar

+0

@srisar - 行为是** undefined **。为什么?因为。任何答案都是错误的。你不应该那样做。 – littleadv