fgets()读取数字到空间

时间:2013-11-19 22:34:23

标签: c fgets

我有一点问题: 我希望fgets()表现得像scanf("%d",...) - 读取输入到空白,而不是整行。有没有办法让它像那样工作?

提前致谢

1 个答案:

答案 0 :(得分:1)

使用fgets()将整行保存到char数组中。然后编写一个函数,使用strtok()将行切割成子串,用空格分隔,并检查每个子串以查看它是否只包含数字。如果是这样,请使用sscanf()从该子字符串读取变量。

或者,您可以首先使用fscanf(),格式为"%s",以便从文件中读取字符串。到达分隔符(空格,新行等)时,fscanf()将停止阅读。检查读取的字符串,如果它包含有效数字,请使用sscanf()atoi()将其转换为数字值。

我想出了这段代码:

#include <stdio.h>

#define VALUE_NOT_PRESENT -1  /* A value you won't expect in your file */

int main()
{
    FILE *f;
    char s[256];
    int n;

    f = fopen ("test.txt","r");
    fscanf (f, "%s", s);
    while (!feof(f))
    {
        n = VALUE_NOT_PRESENT;
        sscanf (s, "%d", &n); /* if s cannot be converted to a number, n won't
                                 be updated, so we can use that to check if
                                 the number in s is actually a valid number */
        if (n == VALUE_NOT_PRESENT)
            printf ("Discarded ");
        else
            printf ("%d ", n);
        fscanf (f, "%s", s);            
    }
    fclose (f);
    printf ("\n");

    return 0;
}

如果读取的字符不能形成有效数字,则使用*scanf族函数的功能不更新变量。

使用包含此内容的文件执行:

1 2 -3
-4 abc
5 6 a12 6c7

它能够将abca12识别为无效数字,因此会被丢弃。不幸的是,它将6c7识别为6。我不知道这对你是否合适。如果没有,您可能必须编写一个函数,该函数将使用状态机驱动的解析器接受或拒绝该字符串作为数字。我不知道标准库中是否存在这样的功能,但肯定可以在那里使用。