c - Strtol 函数返回错误值
问题描述
我需要在练习中获取信用卡号作为输入,所以我使用函数 fgets (将其作为字符串获取以检查它是否真的是一个数字),然后 strtol 使其成为一个长整数。但是函数返回的整数值与字符串上的不匹配。
while (*endptr != '\n') {
char card_number_string[20];
char *endptr;
long int card_number;
printf("Number: ");
fgets(card_number_string, 20, stdin);
card_number = strtol(card_number_string, &endptr, 10);
printf("Result: %ld", card_number);
}
例如,当我输入值 4003600000000014 时,printf 中显示的 strtol 的输出为 2147483647。
这是我的代码上的错误吗?或者该函数确实返回了类似这样的不同的东西?
注意:所有变量都声明在主函数之上,它们在那里只是为了知道它们是如何声明的
解决方案
值超出long
范围。2147483647 是您的情况的最大值long
。
使用long long
. (或者unsigned long long
如果不需要负 CC#)
//long int card_number;
long long card_number;
printf("Number: ");
fgets(card_number_string, 20, stdin);
//card_number = strtol(card_number_string, &endptr, 10);
card_number = strtoll(card_number_string, &endptr, 10);
//printf("Result: %ld", card_number);
printf("Result: %lld", card_number);
注意:char *endptr;
阴影endptr
在while (*endptr != '\n')
推荐阅读
- python - 我正在尝试将 CSV 文件条目与 ldap 生产服务器进行比较并打印不匹配的结果
- for-loop - IntroJs 提示和使用 for 循环切换显示/隐藏
- javascript - 在 Typescript 中,如何将泛型传递给索引访问类型?
- gcc - 可视代码说编译器无法识别
- javascript - 如何放大圆形包装中的单个圆形节点
- kubernetes - 无法在本地 kubernetes 集群中部署 emissary-ingress。因“验证数据错误:ValidationError(CustomResourceDefinition.spec)”而失败
- clojure - Clojure Portal 工具:缺少异常查看器和其他自定义查看器
- stenciljs - Stencil js:更新组件外的DOM元素
- python - 在某个定义的时间范围内获取kafka队列的数据
- spring - 如何使用带有继承的 ConfigurationProperties 来绑定 yml 文件中的属性值