由于冒号

时间:2018-01-06 19:03:25

标签: c file scanf colon

Link here

我的输入文件如下所示:

1 2 3 4: 0:: 3 4 5

我需要一个简单的阅读和打印的东西。我不知道结肠的确切行为。可以有任意数量的数字,因此while != EOF必须保留。

#include <stdio.h>

int main()
{
    FILE *p = fopen("in", "r");

    char c;

    while ((c = fgetc(p)) != EOF) {
        if (c == ':')
            continue;

        int i;
        fscanf(p, "%d", &i);
        printf("%d, ", i);
    }

    return 0;
}
上面的

输出1 是:

2, 3, 4, 0, 3, 4, 5

输出2 如果我评论条件,则输出为:

2, 3, 4, 0, 0, 3, 4, 5

我希望找到一个更好的解释结肠行为的方法。

更新

对于输出1,问题是我已经读过while c = fgetc(p)内的第一个字符。以下似乎通过返回一个字符来解决这个问题。

    #include <stdio.h>

int main()
{
    FILE *p = fopen("in", "r");

    char c;

    while ((c = fgetc(p)) != EOF) {
        if (c >= '0' && c <= '9')
            ungetc(c, p);
        if (c == ':')
            continue;
        int i;
        fscanf(p, "%d", &i);
        printf("%d, ", i);
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

您需要跳过所有非数字字符,而不仅仅是冒号。这是因为序列": :4"会导致您的代码跳过第一个冒号,然后无法将" :4"读作int

试试这个:

    while ((c = fgetc(p)) != EOF) {
        if (! isdigit(c))    // skip non-digits
            continue;
        ungetc(c,p);         // put the digit back to the stream
        int i;
        fscanf(p, "%d", &i); // read a number
        printf("%d, ", i);
    }