首页 > 解决方案 > printf long 在数字超过 9 个字符时更改变量

问题描述

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

标签: cprintfscanf

解决方案


根据目标系统架构long,您使用的类型id1可能范围可能只是-2147483647到。2147483647此类型不能用于在您的系统上存储更大的数字。

顺便说一句,%-10.0ldfor的格式id1似乎不正确,因为该值的输出0仅为 10 个空格。精度字段不指定整数的小数位数,而是指定最小位数。

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

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

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

  • 您可以尝试 type 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;
}

推荐阅读