处理一个简单的 C 程序时,我遇到了一个 if 测试:
int line_number = 0;
if ((line_number >= argv[2]) && (line_number <= argv[4]))
gcc 说:
cp.c:25:警告:指针和整数之间的比较 cp.c:25:警告:指针和整数之间的比较
我该怎么做才能正确检查我要处理的行的范围?
处理一个简单的 C 程序时,我遇到了一个 if 测试:
int line_number = 0;
if ((line_number >= argv[2]) && (line_number <= argv[4]))
gcc 说:
cp.c:25:警告:指针和整数之间的比较 cp.c:25:警告:指针和整数之间的比较
我该怎么做才能正确检查我要处理的行的范围?
当然它不起作用:argv
是一个指向char
.. 的指针的指针。目前尚不清楚你想要做什么,但想想这argv[2]
是第三个参数,argv[4]
是第五个参数。但它们是char*
类型(它们是字符串),所以如果你想将它们解析为整数,你应该使用以下函数atoi
:
int value = atoi(argv[2]);
将解析作为第三个参数的 int 并将其放入变量中,然后您可以检查您想要的任何内容。
你不应该使用 function 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 */