c - 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);
}
解决方案
根据目标系统架构long
,您使用的类型id1
可能范围可能只是-2147483647
到。2147483647
此类型不能用于在您的系统上存储更大的数字。
顺便说一句,%-10.0ld
for的格式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;
}
推荐阅读
- selenium - 如何根据测试用例通过百分比设置 Jenkins 作业状态
- blockchain - 为什么 Bitcoin-Qt 和区块链 API 之间的区块链费用存在差异?
- python - 将内容添加到列表
- next.js - 错误“getStaticPaths 只能用于动态页面,不能用于 Next JS”
- producer-consumer - 在生产者/消费者问题的关键部分内循环
- python - 将数据集分布与另一个匹配
- regex - 正则表达式 - 最后一次出现后的所有内容
- javascript - 本机模块的单元测试 - 反应本机应用程序
- php - 有没有办法通过作曲家更新扩展并绕过 Magento2 上的内存限制错误
- flutter - 如何检查小部件是否被删除?