-1

我目前正在通过 Project Euler 问题作为学习 C 的一种方式,但我遇到了问题 #8,程序的实际数学和主要部分都很好,但该方法需要从大(1000 位)中读取单个数字号码,我把它放在一个文件中。

下面的代码是一个测试用例,我的文件“test.txt”是数字“123456789”。我想要做的是在单独的行上打印出每个数字。

#include <stdio.h>

int main()
{
    int c = 0;
    FILE *fp;
    fp = fopen("test.txt", "r");

    while(c != EOF)
    {
        c = fgetc(fp);
        printf("%i\n", c);      

    }

    fclose(fp);

}

当我运行这段代码时,我得到了输出

49
50
51
52
53
54
55
56
57
10
-1

我有一种预感,我的代码中遗漏了一些非常简单的东西,我希望它在 fgetc 位中。如果是这种情况,使用什么功能会更好,我也很好奇为什么会得到如此奇怪的输出 - 当我用我的 1000 位数字尝试它时,我发现一个类似的模式,数字在 49 到 50 左右几乎是周期性地输出。请记住,我只是 C 的初学者,干杯。

4

4 回答 4

2

这些是数字的ASCII

48 = '0'
49 = '1'
50 = '2'

等等。它们采用这种格式是因为它们是存储在表示整数数字的文本文件中的字符。

您需要打印:

if((48 <= c) && (c <= 57))
  printf("%d\n", c - '0');

注意:您需要该if检查,因为 10 是换行符,而 -1 是 EOF,您打印的内容比您想要的要多。

当然,如果检查有很多方法可以做到这一点:

if(('0' <= c) && (c <= '9'))

或者

if(isdigit(c))

关键是您需要检查您是否只需要数字。

于 2012-12-21T15:00:06.540 回答
1

printf("%i\n", c);打印每个数字的ascii 字符代码

下面的代码检查每个字符是否为数字,然后打印数字(通过减去 0 的字符代码)或在遇到非数字内容时发出警告:

while(c != EOF) {
    c = fgetc(fp);
    if (isdigit(c)) {
        printf("%i\n", c-'0');
    }
    else {
        printf(" non-numeric digit (%i)\n", c);
    }
}
于 2012-12-21T14:57:45.983 回答
1

这看起来像您正在打印数字的 ASCII 值。以下是wikipedia上 ASCII 表的片段:

Dec Hex Glyph
48  30  0
49  31  1
50  32  2
51  33  3
52  34  4
53  35  5
54  36  6
55  37  7
56  38  8
57  39  9

最后得到的 and 是换行符10和.-1EOF

当您从文件中读取文本时,它会为您提供 ASCII 字符数据,因此您需要从值中减去字符“0”的偏移量以获取数字:

printf("%d\n", c - '0');

请注意,您可以'0'直接在减法中使用该字符,因为编译器会将其转换为适合您的数字。最好使用 ''0'而不是仅仅减去 48,因为它更清楚您要做什么,而且还因为可能存在不同的字符编码。

于 2012-12-21T14:57:54.473 回答
0

您正在打印每个数字的 ASCII 值并打印 EOF,因为您在阅读之前而不是之后检查:

while((c = fgetc(fp)) != EOF)
{
    printf("%i\n", c-'0');
}
于 2012-12-21T15:01:09.930 回答