当数字位数超过9个字符时,printf long更改变量

时间:2018-11-25 04:57:29

标签: c printf scanf

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

3 个答案:

答案 0 :(得分:1)

您将long的类型id1用于-21474836472147483647的范围,具体取决于目标系统体系结构。此类型不能用于在系统上存储更大的数字。

偶然地,%-10.0ld的格式id1似乎不正确,因为值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;
}

答案 1 :(得分:0)

通常,ID最好存储为字符串。如果某天ID包含字母,不仅更加灵活,而且避免了此类问题。 ID不是算术运算,即您通常无法通过加或减得到任何东西,因此您最好将它们存储为字符串。这样,无论系统上各种整数类型的宽度如何,您都可以轻松支持任何长度。

答案 2 :(得分:0)

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

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