【问题标题】:printf long changes variable when it's digits is more than 9 charsprintf long 在数字超过 9 个字符时更改变量
【发布时间】:2018-11-25 04:57:29
【问题描述】:

我在 C 中有这个简单的代码,每当我输入一个长度超过 9 位的 id 号码时,它都会打印一个不同的号码。怎么了?

void main() {
    long id1;
    double l1, w1;
    printf("enter studint 1 id,lenght and weight: \n");
    scanf("%ld %lf %lf", &id1, &l1, &w1);

    printf("STUDINTS INFORMATION:");
    printf("\n\n%-10.0ld\t %-4.3lf\t %-4.3lf\n", id1, l1, w1); 
}

【问题讨论】:

  • 首先检查scanf()的返回值。
  • "我输入的身份证号码超过 9 位" --> 输入的号码是多少?打印了什么?
  • long 范围只能是 [-2,147,483,647 ... 2,147,483,647]。超出该范围的数字正在自找麻烦。使用更宽的整数类型。
  • %-10.0ld for id1 似乎不正确:如果 id1 == 0 输出将只有 10 个空格。

标签: c printf scanf


【解决方案1】:

您使用类型long 表示id1,其范围可能只有-21474836472147483647,具体取决于目标系统架构。此类型不能用于在您的系统上存储更大的数字。

顺便说一句,id1 的格式 %-10.0ld 似乎不正确,因为值 0 的输出将只有 10 个空格。 precision 字段不指定整数的小数位数,而是指定最小位数。

还要注意,不带参数的main 的原型应该是int main(void),并且您应该测试scanf() 的返回值以避免在无效输入时出现未定义的行为。

为了解决您的问题,以下是可能的解决方案:

  • 您可以使用double 类型,但我不建议这样做。

  • 您可以尝试输入long long int,但您的系统可能不完全支持此类型。

  • 我建议你使用一个字符串来达到你的目的。

这是修改后的版本:

#include <stdio.h>

int main(void) {
    char id1[20];
    double l1, w1;

    printf("enter student 1 id, height and weight:\n");
    if (scanf("%19s%lf%lf", id1, &l1, &w1) != 3) {
        printf("invalid input\n");
        return 1;
    }
    printf("STUDENT INFORMATION:\n");
    printf("\n%-10s\t %-4.3f\t %-4.3f\n", id1, l1, w1);
    return 0;
}

【讨论】:

    【解决方案2】:

    通常,ID 最好存储为字符串。如果 ID 有一天包含字母,不仅会更灵活,而且可以避免此类问题。 ID 不是算术的,也就是说,你通常不能通过加减它们得到任何东西,所以你也可以将它们存储为字符串。然后,您可以轻松支持任何长度,而不管系统上各种整数类型的宽度。

    【讨论】:

      【解决方案3】:

      这是因为 C 语言中 long 的范围是从 -2,147,483,648 到 2,147,483,647。 因此,当您尝试保存超过 9 位的数字时,它会超出范围。

      C 中变量范围的详细信息:https://www.tutorialspoint.com/cprogramming/c_data_types.htm

      【讨论】:

      • 本教程不正确。 long 类型的范围是至少 -21474836472147483647,但它可能更大,就像在 64 位 linux 系统上一样。您正确诊断了 OP 的问题,但该链接具有误导性。
      猜你喜欢
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      • 2017-10-29
      • 1970-01-01
      相关资源
      最近更新 更多