我在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);
}
答案 0 :(得分:1)
您将long
的类型id1
用于-2147483647
到2147483647
的范围,具体取决于目标系统体系结构。此类型不能用于在系统上存储更大的数字。
偶然地,%-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