#include<stdio.h>
int main(void)
{
char ch;
printf("Input a character: ");
scanf("%c",&ch);
printf("Input a string: ");
char str[80];
gets(str);
printf("%c\n",ch);
puts(str);
return 0;
}
期望输出是一个字符和一个字符串……但是为什么不!行!呢!!!
但如果颠倒一下先定义输入字符串后定义输入字符就可以……这是为!什!么!呢!!!
就这么个问题一晚上没整明白累不爱了……
在scanf("%c",&ch);之后加上getchar();
#include<stdio.h>
int main(void)
printf("Input a character: ");
scanf("%c",&ch);
fflush(stdin);//加上这句,清掉输入字符后,你再输入的回车符
printf("Input a string: ");
char str[80];
gets(str);
printf("%c\n",ch);
puts(str);
return 0;
}
字符串
因为本函数可以无限读取,易发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。
这个事实导致gets函数只适用于玩具程序,为了避免这种情况,可以用fgets(stdin) (fgets实际上可以读取标准输入,即大多数情况下的键盘输入),具体参阅fgets词条)来替换gets()。在V7的手册中说明:为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区。
以上内容参考:百度百科-gets
因为你输入一个字符后,又输入了一个回车键,这个回车键被存到了str这个字符数组中
所以出现了下面的输出:
加一句就行了,把标准输入文件缓存中的回车符去掉:
#include<stdio.h>
int main(void)
{
char ch;
printf("Input a character: ");
scanf("%c",&ch);
fflush(stdin);//加上这句,清掉输入字符后,你再输入的回车符
printf("Input a string: ");
char str[80];
gets(str);
printf("%c\n",ch);
puts(str);
return 0;
}
这样就正确了:
这个问题是比较典型的,
主要就是由于scanf函数的不安全性造成的。
原因:因为你在输入的时候会敲回车,但是scanf遇到回车就停止输入,也就是说回车没有被输入,仍然停留在buffer中。于是,在遇到gets的时候,程序一开始就遇到回车,也就是字符串输入结束,从而str的内容为一个回车,这也是为什么输出会有一行空行的原因。加上getchar,程序会将残留的回车吃掉,于是gets的时候,buffer为空,让用户输入。
PS:这个问题在控制台有缓冲的时候会遇到(就是说只有敲回车,程序才会接受到输入),如果控制台没有缓存,则不会有这个问题。所以,如果你用cin.get同样会遇到这个问题,并不像@示申佥11说的是scanf的问题。本回答被提问者采纳
当执行 scanf("%c", &ch); 时,你想想看,你都输入了什么?没错,一个字符,和一个回车('\n')。
scanf在当前输入缓存,找到了%c,写入ch后,将其从输入缓存移除,然后返回。
这时,输入缓存内还有一个字符,'\n'。
当你调用gets(str);后,发现输入缓存中还有内容,而且恰好由'\n'结束,于是,将"\n"这个字符串写入str,然后返回..
如果把连个过程反过来,
先调用 gets(str); 你输入内容.. 若干个字符,然后回车。(输入缓存中的内容自己想象哈)。gets把'\n'以及'\n'之前的所有字符,写入str,然后从输入缓存移除。这时输入缓存为空。
再调用scanf("%c", &ch),由于输入缓存为空,所以等待用户输入,用户输入一个字符,和一个回车,...
明白了吗?