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

sri*_*sar 1 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);


}
Run Code Online (Sandbox Code Playgroud)

这是输入"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?
Run Code Online (Sandbox Code Playgroud)

为什么我在while循环后为同一命令获得两个不同的输出?虽然循环与它有任何关系..请帮助..

lit*_*adv 8

你知道"Hello world is good"超过10个字节吗?在这种情况下的行为是未定义的.任何事情都可能发生,任何事情,从您想要的系统崩溃到重新格式化硬盘驱动器和在ROM上烧垃圾.

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


Cal*_*leb 5

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

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

调用者有责任确保输入线(如果有的话)足够短以适应字符串.