2010-03-08 65 views
1

一个简单的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 

我能做些什么来好好检查范围我想处理的线条?

+1

您可能会发现它有助于构建范围检查所有“一条线”,例如'如果(a <= b && b <= c)',表示“a <= b <= c”的含义。 – 2010-03-09 00:04:39

回答

8

当然这是行不通的:argv是指向char指针..它目前尚不清楚你想要做的,但想想argv[2]是第三个参数和argv[4]是五分之一的内容。但他们char*类型(它们都是字符串),所以如果你想要把它解析为整数,你应该使用功能atoi做到这一点:

int value = atoi(argv[2]); 

将解析INT这是作为第三个参数,并将其放入变量,那么你可以检查你想要的。

+0

谢谢杰克,你做了ydyd的日子:) – Zenet 2010-03-08 23:38:47

+3

那么,你可能*应该*使用'strtol'做它。 'atoi'更易于使用,但难以处理错误的输入。 – 2010-03-08 23:44:46

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 */ 
+0

虽然我同意你不应该使用atoi *大多数时间,但是当你已经知道输入是有效的时候使用它是可行的。例如,作为一些更大的解析的一部分,您可能已经针对BNF语法验证了数据。 – 2010-03-08 23:57:51

+1

“上一个答案”?这是评分最高的答案。没有“之前”。 atoi没有出现在任何地方的问题。你能编辑这个答案,所以它作为一个“独立”的答案是有道理的吗? – 2010-03-08 23:59:24

+0

谢谢安德烈您的回复,但我不明白为什么我不应该使用atoi?它不是POSIX函数吗? – Zenet 2010-03-09 00:01:17