使用命令行参数检查范围

时间:2010-03-08 23:28:58

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

使用简单的C程序我遇到了if测试:

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

gcc说:

cp.c:25: warning: comparison between pointer and integer
cp.c:25: warning: comparison between pointer and integer

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

2 个答案:

答案 0 :(得分:8)

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

int value = atoi(argv[2]);

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

答案 1 :(得分: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 */