C 中的命令行参数整数错误检查

标签 c parsing error-handling integer

我正在尝试从 C 命令行上给出的参数中成功解析一个整数。给定的输入将如下所示:

a.out 2

非常简单。但是我不知道如何对此进行错误检查。例如,以下每个运行都应该抛出错误:

a.out 2hi

a.out 9hello

a.out 4x

当我使用 sscanf 时,我实现的错误处理会捕获整数本身前面的任何非整数字符(例如“> a.out hi4”)。 Atoi() 和 strtol() 不起作用,因为它们只是解析参数前面的整数值。任何帮助将不胜感激!

最佳答案

使用strtol()并检查它转换的末尾是否是字符串的末尾:

char *end;

errno = 0;
long l = strtol(argv[1], &end, 10);  // 0 if you want octal/hex/decimal

if (end == argv[i] || *end != '\0' || ((l == LONG_MIN || l == LONG_MAX) && errno == ERANGE))
    …report problems…
…either use l as a long, or check that it is in the range INT_MIN..INT_MAX

这将悄悄地跳过前导空白。如果这是一个问题,您也可以检查它们:

if (!isdigit((unsigned char)argv[i]) && argv[i] != '+' && argv[i] != '-')
   …first character isn't part of a decimal number…

另请参阅:

关于C 中的命令行参数整数错误检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23051006/

相关文章:

C# 消息框错误消息

c - 嵌套结构分配内存

c - 释放空指针

c - char * const 和 const char * 有什么区别?

parsing - 在 Haskell 中解析谓词

c++ - 尽管 namespace 正确,但重复出现错误

c# - 导入的 C 函数在 C# 中有效,但在 VB6 中无效

c++ - 编写编程语言解析器的最佳实践

Python - 从 XML 解析单行

error-handling - 如何在 Makefile 中设置 pipelinefail