【问题标题】:Strtol function returning wrong valueStrtol 函数返回错误值
【发布时间】:2020-11-22 18:34:07
【问题描述】:

我需要一个信用卡号作为练习的输入,所以我使用函数 fgets(将其作为字符串来检查它是否是一个真正的数字)然后 strtol 使它变长整数。但是函数返回的整数值与字符串上的不匹配。

while (*endptr != '\n') {
        char card_number_string[20];
        char *endptr;
        long int card_number;

        printf("Number: ");
        fgets(card_number_string, 20, stdin);
        card_number = strtol(card_number_string, &endptr, 10);
        printf("Result: %ld", card_number);
    }

例如,当我输入值 4003600000000014 时,printf 中显示的 strtol 的输出为 2147483647。

这是我的代码中的错误吗?或者该函数确实返回了类似这样的不同的东西??

注意:所有变量都声明在主函数之上,它们在那里只是为了知道它们是如何声明的

【问题讨论】:

  • 我认为最好使用字符串(char数组)作为卡号而不是数字变量。假设前 2 位数字是 00。
  • 我使用整数是因为在这个特殊问题中,输入永远不会以 0 开头
  • 在某些情况下,数据看起来像数字,但实际上是字符串,即使所有字符都是数字。

标签: c string strtol


【解决方案1】:

值超出long 范围。在您的情况下,2147483647 是 long 的最大值。

使用long long。 (或 unsigned long long 如果不需要负 CC#)

    //long int card_number;
    long long card_number;

    printf("Number: ");
    fgets(card_number_string, 20, stdin);
    
    //card_number = strtol(card_number_string, &endptr, 10);
    card_number = strtoll(card_number_string, &endptr, 10);

    //printf("Result: %ld", card_number);
    printf("Result: %lld", card_number);

注意:char *endptr; 遮蔽了 endptr 中的 while (*endptr != '\n')

【讨论】:

  • 我通过limits.h检查了最大long值是9804467591446527。并且使用long long变量,函数的输出仍然是错误的。关于 char 它的影子是什么意思?
  • "使用 long long 变量,函数的输出仍然是错误的。" --> 那错误的输出是什么?代码是否使用了strtoll()(2 ells)和"%lld"
  • @LuísOtávio 执行while (*endptr != '\n') { 时,使用的endptr 不是循环内定义的新endptrchar *endptr;
  • 它输出相同的值,但我仍在使用strtol() 而不是strtoll()。现在它起作用了!谢谢!
  • char *endptr; ... while (*endptr != '\n') { 是糟糕的代码。第一次执行while (*endptr != '\n')endptr*endptr 的值是多少?祝你好运。
猜你喜欢
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 2011-03-15
  • 2019-05-02
  • 2019-11-07
相关资源
最近更新 更多