C 使用命令行参数检查范围

C 使用命令行参数检查范围,c,command-line-arguments,type-coercion,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 如何正确检查要处理

在一个简单的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
如何正确检查要处理的行的范围?

当然不起作用:argv是指向char的指针。。现在还不清楚您想要做什么,但请考虑argv[2]是第三个参数,argv[4]是第五个参数。但是它们是char*类型,它们是字符串,因此如果要将它们解析为整数,则应使用函数atoi:


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

当然它不起作用:argv是指向char的指针。。现在还不清楚您想要做什么,但请考虑argv[2]是第三个参数,argv[4]是第五个参数。但是它们是char*类型,它们是字符串,因此如果要将它们解析为整数,则应使用函数atoi:


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

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

虽然Jack的回答是正确的,即必须首先将argv字符串转换为数字,但在输入来自外部世界的情况下使用atoi专门用于此目的是对C编程的犯罪。实际上,在任何情况下,atoi都不能在程序中得到有意义的使用

本例中应该使用的函数是strtol

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

如果您希望最终获得一个int,还应该检查int range或应用程序特定范围的值

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

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

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

虽然Jack的回答是正确的,即必须首先将argv字符串转换为数字,但在输入来自外部世界的情况下使用atoi专门用于此目的是对C编程的犯罪。实际上,在任何情况下,atoi都不能在程序中得到有意义的使用

本例中应该使用的函数是strtol

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

如果您希望最终获得一个int,还应该检查int range或应用程序特定范围的值

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

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

谢谢你,杰克,你创造了我的一天:嗯,你可能应该用strtol。atoi更容易使用,但更难处理错误的输入。谢谢Jack,你创建了myd day:嗯,你可能应该使用strtol来完成。atoi更容易使用,但更难处理错误的输入。虽然我同意大多数时候不应该使用atoi,但在您已经知道输入有效时使用它是可行的。例如,您可能已经根据BNF语法验证了数据,作为某个更大的解析的一部分。上一个答案?这是评价最高的答案。以前没有。atoi没有出现在问题的任何地方。你能把这个答案编辑成一个独立的答案吗?谢谢Andrey的回复,但我不明白为什么我永远不应该使用atoi?它不是一个POSIX函数吗?@ NUR:我从C语言的角度考虑这个问题而不涉及POSIX。atoi函数不提供错误检查方法。例如,输入中的溢出会导致atoi中的未定义行为。这就是为什么atoi是无用的。在您的情况下,输入来自外部,来自用户。当必须进行错误检查时,情况正是如此。请注意,当end始终指向终止的“\0”时,您的错误条件不会导致输入字符串为空。虽然我同意您在大多数情况下不应使用atoi,但如果您已经知道输入是有效的,则可以使用它。例如,您可能已经根据BNF语法验证了数据,作为某个更大的解析的一部分。上一个答案?这是评价最高的答案。以前没有。atoi没有出现在问题的任何地方。你能把这个答案编辑成一个独立的答案吗?谢谢Andrey的回复,但我不明白为什么我永远不应该使用atoi?它不是一个POSIX函数吗?@ NUR:我从C语言的角度考虑这个问题而不涉及POSIX。atoi函数不提供错误检查方法。例如,输入中的溢出会导致atoi中的未定义行为。这就是为什么atoi是无用的。在您的情况下,输入来自外部,来自用户。当必须进行错误检查时,情况正是如此。请注意,当end始终指向终止的“\0”时,错误条件不会导致输入字符串为空。您可能会发现在一行中构造所有范围检查很有帮助,例如,如果a,您可能会发现在一行中构造所有范围检查很有帮助,例如
if (long_value < INT_MIN || long_value > INT_MAX)
  /* Out of bounds error */;

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