fgets不等待键盘输入

时间:2013-09-29 01:51:58

标签: c

我想从用户的键盘输入中读取两个字符串,这是我尝试过的代码:

char nomFichier[50], emp[100], empEtNomFichier[150];
printf("\nDonner le nom du fichier : ");
fgets(nomFichier, sizeof nomFichier, stdin);
printf("\nDonner l'emplacement du fichier : ");
fgets(emp, sizeof emp, stdin)
sprintf(empEtNomFichier, "%s/%s", emp, nomFichier);

问题是,当我运行此代码时,程序不会等待第一个fgets()的键盘输入,广告这就是程序的外观:

Donner le nom du fichier : 
Donner l'emplacement du fichier : /home/ee/Desktop
/home/ee/Desktop

2 个答案:

答案 0 :(得分:5)

问题实际上是fgets()将终止换行符读入字符串。除非填充缓冲区,或者在没有换行符的情况下遇到EOF,否则返回字符串中的最后一个字符将为'\ n'。

通过以下方式摆脱它:

n = strlen(nomFichier);
if (n>0 && nomFichier[n-1]=='\n') { nomFichier[n-1] = 0; }

...并对if块内的emp字符串执行相同操作。还有一些方法可以使用strtok和'\ n'作为分隔符,或者使用带有“%xx [^ \ n]%* c”格式的sscanf,另外我确定其他人有不同的喜欢的解决方案。 (“xx”是该scanf格式的最大字符串长度,以十进制表示。)

顺便说一句,fflush无法解决另一个问题,因为fflush不一定会做任何事情。例如,GNU C实现将fflush(stdin)视为无操作。

问题很可能是由于先前的scanf()读取了一个值,但没有读取换行符。在面向令牌的输入(scanf / fscanf)和面向行的输入(fgets)之间切换的程序必须准备好处理剩余的行。

最快的解决方法是:

scanf("%*[^\n]%*c"); /* discard up to and including the next '\n' character */

......或更直接:

int c;
while ( (c = getchar()) != EOF && c != '\n') { }

无论哪种方式,我都会将它放在一个静态函数中,让优化器决定是否内联它。

每次从scanf()切换到fgets()输入时都需要这样做。

答案 1 :(得分:0)

尝试:

char nomFichier[50], emp[100], empEtNomFichier[150];
printf("\nDonner le nom du fichier : ");
fflush(stdout);
fgets(nomFichier, sizeof nomFichier, stdin);
printf("\nDonner l'emplacement du fichier : ");
fflush(stdout);
fgets(emp, sizeof emp, stdin)
sprintf(empEtNomFichier, "%s/%s", emp, nomFichier);

stdout是行缓冲的,所以没有\ n字符就不会输出 - 试试fflush();

或尝试:

char buf[256]={0x0};
setvbuf(stdout, buf, _IONBF, 256);