关于C#:fgets()将数字读到空格

fgets() reading numbers to space

我有一个小问题:
我希望fgets()的行为像scanf("%d",...)-将输入读取到空格,而不是整行。有什么办法可以使它像这样工作吗?

预先感谢


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

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

我想出了以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#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 ("\
"
);

    return 0;
}

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

使用具有以下内容的文件执行:

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

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