【问题标题】:long integer in CC中的长整数
【发布时间】:2011-09-05 17:00:01
【问题描述】:

如何在 C 中读取 12 位或 13 位的长整数(如书的 ISBN 号)?我想从包含书籍信息(ISBN/name/writer)的文本文件中读取数字。

文本文件的内容是这样的:

0393312836

发条橙

安东尼·伯吉斯

0199536759

中秋节

布雷特·伊斯顿·埃利斯

...

...

...

我正在使用此代码:

int main(void){

    FILE *f;
    char name[MAX], writer[MAX], line[MAX];
    long isbn;

    f=fopen("path.txt","r");
    if(f == NULL){
        return 0;
        }

    while (fgets(line, 1024, f) != NULL){

        sscanf(line,"%ld", &isbn);
        printf("ISBN: %ld\n",isbn);

        fgets(nome, 1024, f);
        printf("NAME: %s",name);

        fgets(line, 1024, f);
        printf("WRITER: %s",writer);


        }
    fclose(f);

    return 0;

}

他能读懂书名和作者的名字,但他只能读9位或更少的数字。我该怎么做才能完成这项工作?

【问题讨论】:

标签: c file integer long-integer


【解决方案1】:

我认为对于 ISBN,使用字符串会好得多。您不需要对该值执行算术运算,您可以存储前导零,并且您需要一个字符串来存储您可以在 ISBN 10 校验和中获得的 X。

【讨论】:

    【解决方案2】:

    只需将其读取为字符串(char 数组)并对其进行处理。使用int,您还会在开始时丢失重要的零点以及有限的范围。 ISBN 号码、电话号码等最好作为字符串处理,因为它们不代表实数(在数学意义上),而只是标识符。

    【讨论】:

      【解决方案3】:

      尝试使用unsigned long long%llu 说明符。在大多数平台上,前者应该是 64 位数字。

      您也可以尝试将其作为字符串读取。这取决于您是想稍后将其作为字符串还是数字来操作。

      例如,如果您想按字母顺序对它们进行排序,请将它们作为字符串读取。如果要将它们按数字排序,请将它们视为数字。

      【讨论】:

      • 就目前而言是正确的,但您没有得到支持,因为您推荐了%llu 而不是strtoll*scanf 函数不能可靠地用于此类工作;当输入不完全符合预期时,它们无法让您充分控制会发生什么。
      • @Zack:确实如此,我只是建议了最快的改变。
      【解决方案4】:

      最好将它们作为字符串或字符数组读取。 ISBN 数字是指您将对其进行计算的数字。相反,它们更像是一个恰好是数字的参考字符串。读取字符数组将使您获得包含破折号或其他分隔符的 ISBN 编号,如下所述:http://www.isbn.org/standards/home/isbn/international/html/usm4.htm

      如果您确实想将它们存储为数字,则应将其作为 char 数组读入并清理它以防输入中存在空格、破折号或其他非数字字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-06
        • 1970-01-01
        • 1970-01-01
        • 2011-03-05
        • 2017-12-06
        • 1970-01-01
        • 2011-07-13
        相关资源
        最近更新 更多