c - 我应该如何验证从 argv 传入的整数值不会溢出?
问题描述
我有一个程序要求用户输入一个整数作为命令行参数,格式为./program 100
.
显然这会将值作为字符串读取,因此我需要将其解析为整数。我必须确保输入值不会溢出整数变量。我已经阅读过strtol()
,但它适用于long
变量,我必须坚持使用常规的int
.
有没有类似的东西可以用于 a int
?
解决方案
你可以用strtol
这个。您首先需要检查此函数是否无法转换值。如果转换成功,则检查该值是否在 to 范围INT_MIN
内INT_MAX
:
errno = 0;
long x = strtol(argv[1], NULL, 10);
if (errno) {
perror("conversion failed");
} else if (x < INT_MIN) {
printf("value too small\n");
} else if (x > INT_MAX) {
printf("value too big\n");
} else {
printf("value = %ld\n", x);
}
请注意,无论long
大小相同int
或更大,这都将起作用。
如果sizeof(long) > sizeof(int)
,INT_MIN
andINT_MAX
检查将捕获值适合 along
但不适合 的情况int
。如果sizeof(long) == sizeof(int)
,超出范围的值将导致errno
设置为非零以捕获错误,并且INT_MIN
和INT_MAX
情况永远不会为真。
推荐阅读
- sql-server-data-tools - SSDT 数据库项目中对象未解析引用的解决方案
- c# - 尝试使用 C# 截取在 BlueStacks 中运行的游戏的屏幕截图
- powershell - PowerShell - 使用 PowerShell 时 WSUS 服务器的上次报告和同步时间值不匹配
- bots - 如何解码 .wasm 代码?可能吗?
- makefile - 为什么 Makefile 忽略我对 .o 文件的规则?
- java - 删除下载目录中的文件
- android - Hello World 应用程序无法在三星手机上运行
- c - 用于交换字符串的输出相关查询
- typescript - TypeORM RelationCount 替代
- c# - 使用 C# 将 Datatable 转换为嵌套列表/对象