我想从用户的键盘输入中读取两个字符串,这是我尝试过的代码:
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
答案 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);