C语言按字符串指令运算时10位以上大数溢出如何解决
问题修复方案
错误原因
- 输出格式符不匹配:变量
c为long long类型,但代码中用%d(仅适用于32位int类型)输出。32位int最大可表示约21亿的正数,超过10位的数值会被截断,导致输出错误。 - 次要不规范问题:
scanf("%s", &string);写法有误,数组名本身就是首地址,无需额外加取地址符&;循环条件每次调用strlen计算字符串长度,会产生不必要的性能损耗。
修正后完整代码
#include <stdio.h> #include <string.h> int main(){ char string[250]; long long c = 1; scanf("%s", string); int str_len = strlen(string); for(int i = 0; i < str_len; i++){ if(string[i] == 't' || string[i] == 'T'){ c *= 3; i += 7; continue; } if(string[i] == 'd' || string[i] == 'D'){ c *= 2; i += 4; continue; } if(string[i] == 'm' || string[i] == 'M'){ c -= 1; i += 4; continue; } } printf("%lld", c); return 0; }
调整说明
- 输出格式符替换为
%lld,匹配long long类型的输出规则,支持最大9×10^18以内的数值输出,完全覆盖示例的13位结果需求。 - 修正
scanf的参数写法,避免潜在内存访问隐患。 - 提前计算字符串长度存入变量,避免循环重复计算,提升运行效率。
使用你提供的输入测试,修改后代码可正常输出3645621927936。
内容的提问来源于stack exchange,提问作者hirbry
相关产品推荐
相关产品推荐

