使用简单的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
如何正确检查我想要处理的行数范围?
答案 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 */