【问题标题】:How to make this program read double digit integers and triple digits in C?如何让这个程序读取 C 中的两位整数和三位数?
【发布时间】:2015-05-01 09:35:22
【问题描述】:

所以这个函数从一个由空格分隔的文件中读取整数并获取总数。它工作正常。

只要是个位数,1-9。
如何让它读取 1-100 的两位数?
我是否在读取每个数字的 if 中创建一个嵌套的 if,然后尝试在它旁边不带空格地读取第二个数字,然后再读取第三个数字(案例 100)?

然后我把它们变成一个整数(老实说我不知道​​该怎么做)

void get_total(FILE*fp){

char c;

int total=0;
int number_of_conversions;

number_of_conversions = fscanf(fp, "%c", &c);

while (isdigit(c) || isspace(c) && c !='\n' && c !=NULL){

    if (isspace(c)){
        number_of_conversions = fscanf(fp, "%c", &c);
    }
    else if (isdigit(c)){

        total = total + (c- '0');

        number_of_conversions = fscanf(fp, "%c", &c);

    } 

    number_of_conversions = fscanf(fp, "%c", &c);
}

printf("%d", total);

}

【问题讨论】:

  • 搜索一下函数:fgets、strtok 和 strtol!我觉得是个不错的选择! (y)。该程序正在读取字符而不是数字。该文件包含数字的 ascii 表示。您可以使用 fgets 加载一行,解析它以使用 strtok 提取表示数字的字符串,并使用 strtol 将字符串转换为数字。 (y)
  • 我想到了一种添加数字的方法。我不确定它是否有效。但只要有两位数。将第一个乘以 10 并添加第二个。或 3 (100) 将第一个乘以 100。第二个乘以 10 并加上第三个。应该可以的。
  • sergio 我还没学过,所以我不想做我不明白的事情。
  • 如果将 char 1 乘以 10,如果将其用作 int,则会得到结果 490;如果您按原样使用它,一个字符,您将获得 (490 & 255) 其中 & 是逻辑和!因为一个字符(通常)只有 8 位! ...这是因为 char 1 的 ASCII 值是 49 (0x31)!
  • 如果你逐个字符地阅读字符,你可以尝试这样的事情:声明一个 int。例如:int a;在读取数字的第一个字符之前:a=0,然后对于您读取的所有字符,直到到达空格,您执行以下操作:a=a * 10 + (c - 48); ...然后在 int a 你有数字。

标签: c type-conversion digits


【解决方案1】:

这取决于您是否打算(或打算)以最少的编程工作获得整数,或者自己练习或制定如何进行(十进制)转换。

如果是前者,您需要仔细看看fscanf 可以为您做什么:如果您使用转换说明符,例如"%d""%i",您可以在一次调用中输入任何整数fscanf.

如果是后者,使用fgetc(fp) 更有意义——使用fscanf(fp,"%c",&c) 读取单个字节非常笨拙。在这种情况下,您在评论中处于正确的轨道:只需从 0 开始,每次找到一个(十进制)数字乘以到目前为止的整数结果乘以 10 并添加新数字。

对您的代码的评论:

  • 比较cNULL 的风格很差,因为NULL 代表一个指针,尽管它比较等于0。
  • 您似乎认为c 会在您到达文件末尾时更新。
  • 您似乎停在了第一行的末尾:您是否在多行文件上测试过您的程序?
  • 您应该检查fscanf 是否返回EOF - 始终阅读您不太了解的函数的文档!
  • 您似乎每次通过循环读取两个字符,并且只处理其中一个。

【讨论】:

  • 是的,下一步是多行。但我不知道该怎么做。尽管我确信困难的部分已经结束。有什么建议吗?
  • 希望你查过我的cmets:第三个是因为你的程序中有'\n'
【解决方案2】:

您可能希望首先将发布的代码简化为以下简单内容:

void get_total(FILE*fp)
{

    int c;

    int total=0;
    int value;

    while (fscanf(fp, "%c", &c) )
    {
        if( !isdigit(c) )
        { // then some kind of number separater found
            total += value;
            printf("value: %d, total: %d", value, total);
            value = 0;
        }

        else
        { // accumulate number
            value *= 10;      // make room for next digit
            value += c - '0'; // convert digit to int
        }
    }

    // print last value
    printf("last value: %d, final total: %d", value, total);
}

【讨论】:

    猜你喜欢
    • 2011-12-13
    • 2021-02-10
    • 2019-03-15
    • 2015-04-18
    • 2017-12-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多