繁体   English   中英

如何检查在 C 中的命令行中传递的参数?

[英]How to check arguments passed in command line in C?

我正在用 C 语言编写一个用于基本计算器的程序。 我正在尝试使用我迄今为止学到的知识来做到这一点:printf() 和 scanf() 函数。 我正在通过命令行将参数传递到我的程序中。 我假设将一次传递三个参数,其中包括:第一个 int、一个运算符和第二个 int。 我想检查传递的第二个 arg 是否是一个运算符,然后检查它是否是 +,-,*... 等等。 这是我想出的:

int main(int argc, char **argv) {
        scanf("%d %c %d", &a, &oper, &b);
        if (oper != 43) {
                  printf("Error: Operator is not a +");
                  return(1);
        }
}

所以很明显,我省略了很多代码并保留了相关部分。 在这里,我只是检查操作符是否为 +。 ASCII 密钥是 43,所以我认为这会起作用,但没有运气! 有任何想法吗? (如果可能的话,我想看看我是否可以只用 printf 和 scanf 来做到这一点)

编辑:例如,如果输入了 12 b 13,它应该返回上面的错误。 '10 +a 10' 或 '10 ++ 10' 也是如此。

首先,我强烈建议您查看您遇到的任何 C 库函数的手册页,它们有很多有用的信息。 似乎您使用 scanf() 不正确,因为它没有与命令行参数一起使用。

您可以通过像这样比较参数来检查单个字符的匹配项:

if(argv[2][0] == '+') ...

(argv[0] 是程序的文件名)。

如果想比较字符串,可以使用 strcmp()。 但是对于运算符示例,您可以像这样检查参数中的第一个和第二个字符:

if(argv[2][0] == '+' && argv[2][0] == '\0') ...

这样做是比较参数的前两个字符。 它首先检查'+' ,然后通过检查空终止符'\\0'检查它是否是字符串的结尾。

我们可以假设任何参数至少有两个字符,可见字符和空终止符。 但是,在其他字符串上执行此操作并不能保证这一点。

其他字符,特别是数字需要从它们各自的 ASCII 值转换为整数。 您可以使用 atoi 或 strtol 来执行此操作,尽管 atoi 对您来说很可能更容易。

正如 David C. Rankin 指出的那样, **argv是一个双指针,在高层次上,在大多数情况下,您可以将其视为双数组。 在 C 中,字符串实际上只是一个 char 类型的数组,因此上面的argv[2]所做的是首先访问**argv的第三个索引,现在将其取消引用到类型char *其中字符串 (char array ) 位于。 然后可以通过argv[2][0][0]进一步取消引用以查看字符串的第一个字符。

代码示例:

char **my_arrays = argv; // a array of arrays
char *array = *argv;       // de-references to index 0 in argv
char *array = *(argv + 1); // de-references to index 1 in argv
char *array = argv[0];     // de-references to index 0 in argv
char *array = argv[1];     // de-references to index 1 in argv

char first_char = *(*argv)   // the first char of the first array of argv
char first_char = *(argv[0]) // the same as above
char first_char = argv[0][0] // the same as above

旁注。 C 中的所有字符串都应以空终止符结尾,该终止符可以由NULL0'\\0'值表示。 这将代表字符串的结尾,许多 C 函数依靠它来知道何时停止。 此外NULL从技术上讲是一个 C 宏,但您不需要将其与0区别对待,因为它实际上只是扩展为0

  1. 它是char **argv 正如一些程序员说的那样,你应该重读你的书/教程。
  2. scanf不读取参数。 它从标准输入读取。
  3. 参数的类型为char*并存储在 argv 中。 要将这些参数转换为整数,请使用atoistrtol (最好是 strtol)。 有关更多信息,请参阅内容。
  4. 如果您想使用 scanf 从标准输入读取,那很好,只要您将数据输入标准输入,而不是作为命令行参数,您所拥有的内容就可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM