【问题标题】:Checking range with command line arguments使用命令行参数检查范围
【发布时间】:2011-01-25 05:21:47
【问题描述】:

在一个简单的 C 程序上工作,我遇到了一个 if 测试:

int line_number = 0;
if ((line_number >= argv[2]) && (line_number <= argv[4]))

gcc 说:

cp.c:25:警告:指针和整数之间的比较 cp.c:25:警告:指针和整数之间的比较

如何正确检查我要处理的行的范围?

【问题讨论】:

  • 您可能会发现在“一行”中构建范围检查很有帮助,例如if (a &lt;= b &amp;&amp; b &lt;= c),代表a &lt;= b &lt;= c的意思。

标签: c command-line-arguments type-coercion


【解决方案1】:

当然它不起作用:argv 是一个指向 char 的指针.. 不清楚你想做什么,但想想argv[2] 是第三个参数,argv[4] 是第五个.但它们是char* 类型(它们是字符串),所以如果你想将它们解析为整数,你应该使用函数atoi

int value = atoi(argv[2]);

将解析作为第三个参数的 int 并将其放入变量中,然后您可以检查您想要的任何内容。

【讨论】:

  • 谢谢杰克,你度过了我的一天 :)
  • 好吧,你可能应该使用strtol来做这件事。 atoi 更易于使用,但更难处理错误输入。
【解决方案2】:

您不应该使用函数atoi。如果事实如此,你应该忘记它曾经存在过。它没有实际用途。

虽然杰克的回答是正确地指出必须首先将argv 字符串转换为数字,但为此目的使用atoi(特别是在输入来自“外部世界”的情况下)是犯罪行为反对C编程。几乎没有任何情况可以在程序中有意义地使用atoi

在这种情况下你应该使用的函数是strtol

char *end;
long long_value = strtol(argv[2], &end, 10);
if (*end != '\0' || errno == ERANGE)
  /* Conversion error happened */;

确切的错误检查条件(例如是否需要*end == '\0')实际上取决于您的意图。

如果您想最终获得int,您还应该检查int 范围(或您的应用程序特定范围)的值

if (long_value < INT_MIN || long_value > INT_MAX)
  /* Out of bounds error */;

int value = long_value;
/* This is your final value */

【讨论】:

  • 虽然我同意您不应该在大多数的情况下使用 atoi,但在您已经知道输入有效时使用它是实用的。例如,您可能已经根据 BNF 语法验证了数据,作为更大解析的一部分。
  • “上一个答案”?这是评分最高的答案。没有“以前的”。 atoi 不会出现在问题的任何地方。您可以编辑此答案,使其作为“独立”答案有意义吗?
  • 感谢 Andrey 的回复,但我不明白为什么我永远不应该使用 atoi?它不是 POSIX 函数吗?
  • @nour:我从 C 语言的角度考虑这个问题(不涉及 POSIX)。 atoi 函数不提供错误检查方法。例如,输入中的溢出会导致atoi 中的未定义行为。这就是为什么atoi 没用的原因。在您的情况下,输入来自外部,来自用户。这正是必须进行错误检查时的情况。
  • 请注意,您的错误条件不考虑空输入字符串(当end 将始终指向终止'\0'
猜你喜欢
  • 1970-01-01
  • 2017-03-10
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多