为什么这个奇怪的输出在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循环有什么关系呢..请帮助..
你的字符数组ch
只有10个字符的空间。你输入了超过10个字符的东西,并试图将其存储在该数组中,有效地将超出数组末尾的空间写入没有预留给任何东西(或者至少不会保留给你的字符)的空间中。你有在这种情况下,幸运地在任何重要的东西没有写(您的程序没有崩溃),但随后的代码来走过(printf()
,你int i
等)和变化内存(它的堆栈,毕竟,所以它以FIFO顺序使用)。
更改char ch[10]
到char ch[2048]
给自己一个更大的缓冲区来键入。您也可以使用fgets()
而不是gets()
,这样您可以将输入大小限制为缓冲区大小。如果你使用gets()
,听取手册页上的警告:
这是调用者的责任,以确保输入线,如果 任何,足够短,以适应的字符串中。
谢谢,这是非常有益的感谢大家.... – srisar
你知道的“Hello world好”超过10个字节?在这种情况下的行为是undefined。任何事情都可能发生,无论如何,从你的工作想要到您的系统的总崩溃与重新格式化硬盘驱动器和燃烧的垃圾通过您的ROM。
必须为gets
分配足够的空间放于字符串,在这种情况下你不知道。这是为什么gets
应该避免的主要原因,请使用fgets
来代替。
我很感激downvoter的评论,谢谢 – littleadv
好吧,你有一方面的大教堂,另一方面是奇怪的:^) –
不要使用'gets'! **从来没有!** –