使用scanf()的后浪费太多的时间来搜索,为什么我的程序不执行gets()函数后,我发现了一个解决方案,就是使用fflush(标准输入)的scanf()后,使得到()得到一个字符串。
问题是,fflush(标准输入)不会做什么是由它预计:该程序继续跳过得到()和我不能写在控制台中的任何短语被读取。
我的代码是下一个:
#include <string.h>
#include <stdio.h>
int main(){
char nombre[10];
char mensaje[80];
printf("Type your name:\n");
scanf("%s", nombre);
fflush(stdin);
printf("Now, type a message:\n");
gets(mensaje);
printf("3/%s:%s",nombre,mensaje);
return 0;
}
如果冲洗STD不工作,然后尝试读取多余的字符和丢弃,如建议在这里 。
这将工作:
#include <string.h>
#include <stdio.h>
int main(){
char nombre[10];
char mensaje[80];
int c;
printf("Type your name:\n");
scanf("%9s", nombre);
while((c= getchar()) != '\n' && c != EOF)
/* discard */ ;
printf("Now, type a message:\n");
gets(mensaje);
printf("%s:%s",nombre,mensaje);
return 0;
}
两个大,主要问题:
不要使用fflush
对输入流 ; 的行为fflush
没有定义在输入流。 只是因为它似乎在这种情况下工作,并不意味着它是正确的。
永远永远永远永远永远永远不要使用gets
-这是过时的C99标准,并已经从C2011标准完全去除。 这将 (可能不将 )在你的代码引进失败的一大看点。
这是不是一个好主意遵循scanf
调用与gets
的呼叫,因为gets
不会跳过留下的输入流中的任何领先的换行符scanf
。 使用scanf
读取这两种 nombre
和mesaje
。
printf("Type your name:\n");
scanf("%9s", nombre);
printf("Now, type a message:\n");
scanf("%79s", mensaje);
它是用在一个明确的长度说明一个好主意, scanf
呼吁%s
和%[
,否则你介绍的一样安全漏洞gets
呢。
编辑
D'哦。 我是个白痴。 如果你想读取包含空格的字符串,你不能使用%s
转换符。 使用%[
转换符,而不是:
scanf( "%79[^\n]", mensage );
将读取到下一个79个字符或换行,以先到者为准,并保留输入流中的换行符。
试试这个:
scanf("%s\n", nombre);
阅读部分时的scanf停在空白。 得到读取,直到第一个新的生产线。 所以会发生什么是scanf的叶子在缓冲区,它得到立即看到,认为它被赋予一个空行换行后面。
如果你把你的原代码,并输入“姓名的消息”,两片都在同一行,你可以看到在行动这一点 - 获取仍将立即返回,但它会看到第二部分。
在scanf的东西\ n告诉它继续前进,消耗太多。
while (fgetc(stdin) != '\n'); // seems to work