为什么在c语言中会出现这种奇怪的输出?

为什么在c语言中会出现这种奇怪的输出?,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",

我有以下程序

#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);


}
为什么在while循环之后,同一个命令会得到两个不同的输出?while循环是否与此有关。。请帮忙。

你知道“Hello world is good”超过10个字节吗?本例中的行为是未定义的。任何事情都有可能发生,任何事情都有可能发生,从按自己的意愿工作到重新格式化硬盘驱动器导致系统彻底崩溃,再到在ROM上烧掉垃圾

您必须为
get
分配足够的空间来放入字符串,在这种情况下,您不需要。这就是为什么应该避免使用
get
,而是使用
fgets

你知道“Hello world is good”超过10个字节吗?本例中的行为是未定义的。任何事情都有可能发生,任何事情都有可能发生,从按自己的意愿工作到重新格式化硬盘驱动器导致系统彻底崩溃,再到在ROM上烧掉垃圾


您必须为
get
分配足够的空间来放入字符串,在这种情况下,您不需要。这就是为什么应该避免使用
gets
,而是使用
fgets

好吧,您只分配了10个字符(
char ch[10]
),适合“hello worl”。之后,您试图打印的内存中只有垃圾。

好吧,您只分配了10个字符(
char ch[10]
)来匹配“hello worl”。之后,您试图打印的内存中只有垃圾。

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

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

调用者有责任确保输入行 任何一根都足够短,可以插进绳子里


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

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

调用者有责任确保输入行 任何一根都足够短,可以插进绳子里


好吧,一方面是大教堂,另一方面是怪异:^)永远不要使用
get
!从不好吧,一方面是大教堂,另一方面是怪异:^)永远不要使用
get
!从不但为什么它会在被立即调用时完全打印出来。。。而不是在while循环之后??这是我的问题。。。为了测试这一点,特意使用了10字节。。你能帮忙吗now@srisar-行为未定义。为什么?因为任何答案都是错误的。你不应该这样做。可能是因为之后你分配了一个整数,这会弄乱先前分配的字符数组。投票人往往是懦夫,这是匿名投票的必然结果。我抵消了它。但为什么它在被立即调用时完全打印出来。。。而不是在while循环之后??这是我的问题。。。为了测试这一点,特意使用了10字节。。你能帮忙吗now@srisar-行为未定义。为什么?因为任何答案都是错误的。你不应该这样做。可能是因为之后你分配了一个整数,这会弄乱先前分配的字符数组。投票人往往是懦夫,这是匿名投票的必然结果。我抵消了它。
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♂