0

在我的 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);语句,它工作正常。此外,如果在getchar();上面添加一条语句,fgets它将正常工作。有谁知道这个问题背后的原因?

4

3 回答 3

4

这是因为您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 库中的扩展允许它。fflush根据 C 规范,调用输入流是未定义的行为。参见例如Linux 手册页Windows 参考页

于 2013-12-17T11:50:53.370 回答
0

如果您使用sscanf并输入数字,则按“Enter”...数字由 处理sscanf,但“Enter”由fgets

于 2013-12-17T11:50:13.380 回答
0

这是因为读取前一个留下fgets的换行符。吃掉这个的一种可能的方法是添加一个after 。 \nscanf\ngetcharscanf

    getchar();
    printf("Enter a string : \n");
    fgets(string, sizeof(string), stdin);
于 2013-12-17T11:51:35.140 回答