我有以下程序
#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循环与它有什么关系..请帮助..
答案 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]
)。之后,你试图打印的内存中只有垃圾。