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

标签 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); 
}

最佳答案

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

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

另请注意 main没有参数应该有一个原型(prototype) 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;
}

关于c - 当数字超过 9 个字符时,printf long 会更改变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53464771/

相关文章:

c - 如何打印循环结果?

c - scanf 格式字符串无法识别

c - 行尾奇怪的 sscanf 行为

c - 随机数问题(C)

c++ - 指向存储在结构中的数组的指针在哪里?

c - 使用 exec 启动应用程序/附件

c - 为什么我对 printf() 的调用无法在控制台中显示正确的字符?

C 比较数组元素与字符串

C - 用 %s 和 char * 重复 printf()

c - 我的程序跳过获取输入数据?