C代码的奇怪行为(fgets函数)

  • 本文关键字:fgets 函数 代码 c cc
  • 更新时间 :
  • 英文 :


在我的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);

相关内容

  • 没有找到相关文章

最新更新