Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使这个程序在C中读取两位数整数和三位数?_C_Type Conversion_Digits - Fatal编程技术网

如何使这个程序在C中读取两位数整数和三位数?

如何使这个程序在C中读取两位数整数和三位数?,c,type-conversion,digits,C,Type Conversion,Digits,所以这个函数从一个文件中读取整数,这些整数由空格分隔,并得到总数。它很好用 只要数字是个位数,1-9。 如何使其读取1-100之间的两位数? 我是否在ifs中创建一个嵌套的if,读取每个数字,然后尝试读取紧挨着它的第二个数字,不留空格,然后读取第三个数字(案例100) 然后我把它们变成一个整数(老实说,我不知道怎么做) }这取决于您是否打算(或打算)以最少的编程工作量获得整数,或者自己练习或解决如何进行(十进制)转换 如果是前者,您需要仔细看看fscanf可以为您做些什么:如果您使用转换说明符,

所以这个函数从一个文件中读取整数,这些整数由空格分隔,并得到总数。它很好用

只要数字是个位数,1-9。
如何使其读取1-100之间的两位数?
我是否在ifs中创建一个嵌套的if,读取每个数字,然后尝试读取紧挨着它的第二个数字,不留空格,然后读取第三个数字(案例100)

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

}

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

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

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

对代码的评论:

  • c
    NULL
    进行比较是一种糟糕的风格,因为
    NULL
    代表指针,尽管它的比较值等于0
  • 您似乎认为,如果到达文件末尾,
    c
    将被更新
  • 您似乎停在第一行的末尾:您是否在多行文件上测试了您的程序
  • 您应该检查
    fscanf
    是否返回
    EOF
    –务必阅读您不太熟悉的函数文档
  • 每次通过循环时,您似乎都要读取两个字符,并且只处理其中一个字符

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

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);
}

搜索有关函数的内容:fgets、strtok和strtol!我认为这是一个很好的选择!(y) 。此程序正在读取字符而不是数字。该文件包含数字的ascii表示形式。您可以使用fgets加载一行,使用strtok解析它以提取表示数字的字符串,并使用strtol转换数字中的字符串。(y) 我想了一个方法来增加数字。我不确定它是否有效。但只要有两位数就行了。将第一个数乘以10,然后将第二个数相加。或3(100)乘以第一个100。第二个乘以10,再加上第三个。塞尔吉奥:我还没学会,所以我不想做我不懂的事情。如果你把字符1乘以10,如果你把它作为一个整数,你就会得到结果490;如果将其用作字符,则获得(490和255),其中&是逻辑和!因为一个字符(通常)只有8位。。。这是因为字符1的ASCII值是49(0x31)!如果你一个字符一个字符地读,你可以这样做:声明一个int;在读取一个数字的第一个字符之前,您需要执行以下操作:a=0,然后对于在到达空格之前读取的数字的所有字符,您需要执行以下操作:a=a*10+(c-48)。。。然后在整数a中有数字。是的,下一步是多行。但我不知道该怎么做。虽然我确信困难的部分已经过去了。有什么建议吗?我希望你仔细阅读我的评论:第三点是因为你的节目中有
'\n'
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);
}