在我的C程序中,fgets
没有读取任何数据。请参阅以下代码:
#include <stdio.h>
int main()
{
char string[50];
int marks,i,n, limit;
printf("Enter Limit : n");
scanf("%d", &limit);
FILE *fptr; fptr=(fopen("string.txt","w"));
if(fptr==NULL){
printf("Error!");
return 0;
}
printf("Enter a string : n");
fgets(string, sizeof(string), stdin);
fwrite(string, 1, sizeof(string), fptr);
fclose(fptr);
return 0;
}
在我输入限制后,程序显示"输入字符串",然后退出(在输入任何数据之前)。如果我删除scanf("%d", &limit);
语句,它可以正常工作。此外,如果在fgets
之上添加getchar();
语句,它也会正常工作。有人知道这个问题背后的原因吗?
这是因为您在代码的早期使用了scanf
。当您输入数字作为输入时,按enter键标记输入的结束,并在输入缓冲区中添加一行换行符。scanf
所做的是读取数字,但将换行符(回车键)留在输入缓冲区中。然后当你调用fgets
时,它会看到这条单独的换行符并读取它
对此,一个非常简单的解决方案是告诉scanf
在格式代码后面添加一个空格来跳过后面的空白
scanf("%d ", &limit);
/* ^ */
/* | */
/* Note space here */
如果上面的解决方案不起作用,那么你可以读取字符,直到你得到一条换行符:
int c;
while ((c = fgetc(stdin)) != EOF && c != 'n')
;
此外,在Mac OSX中还有fpurge
功能,可用于清除输入流中的未读数据:
fpurge(stdin);
注意:fpurge
功能是不可移植的。
在Linux和Windows上,您可以使用fflush
来执行与fpurge
相同的操作,但请注意,它是Linux和Windows库中允许的扩展。根据C规范,在输入流上调用fflush
是未定义的行为。请参阅例如Linux手册页或Windows参考页。
如果使用sscanf
并输入数字,则按"enter"。。。数字由sscanf
处理,但"回车"由fgets
处理
这是因为fgets
读取上一个scanf
留下的换行符n
。吃掉这个n
的一种可能的方法是在scanf
之后添加getchar
。
getchar();
printf("Enter a string : n");
fgets(string, sizeof(string), stdin);