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

时间:2011-09-20 04:31:20

标签: 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 is good”时的输出

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循环与它有什么关系..请帮助..

3 个答案:

答案 0 :(得分:8)

你知道“Hello world is good”超过10个字节吗?在这种情况下的行为是未定义。任何事情都可能发生,任何事情,从你想要的工作到你的系统完全崩溃,重新格式化硬盘并在你的ROM上烧垃圾。

你必须为gets分配足够的空间来放入字符串,在这种情况下你不需要。这是应该避免使用gets的主要原因,请改用fgets

答案 1 :(得分:5)

您的角色数组ch只有10个字符的空间。你键入了超过10个字符的东西,并尝试将它存储在该数组中,有效地将数组的末尾写入不为任何东西保留的空间(或者至少不为你的字符保留)。在这种情况下你很幸运,并没有写任何重要的东西(你的程序没有崩溃),但随后的代码出现(printf(),你的int i等)并改变了那些记忆(毕竟,它是堆栈,因此它以FIFO顺序使用)。

将您的char ch[10]更改为char ch[2048],为自己输入更大的缓冲区。您也可以使用fgets()而不是gets(),以便可以将输入的大小限制为缓冲区大小。如果您使用gets(),请注意手册页上的警告:

  

调用者有责任确保输入行,如果   任何,足够短,以适应字符串。

答案 2 :(得分:2)

嗯,你只分配10个符合“hello world”的字符(char ch[10])。之后,你试图打印的内存中只有垃圾。