【问题标题】:How to check arguments passed in command line in C?如何检查在C命令行中传递的参数?
【发布时间】:2021-02-14 18:38:13
【问题描述】:

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

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' 也是如此。

【问题讨论】:

  • char ++argv?您似乎错过了书籍或教程中的某些内容。要么,要么你需要创建一个合适的minimal reproducible example 来展示给我们。
  • 不要使用magic numbers。如果43 是指'+' 的ASCII 码,请改用实际字符。
  • 错字!!刚刚修好了。
  • scanf 函数仅从标准输入读取。如果您想将输入作为命令行参数,那么您需要检查argv 中的字符串(在first 检查argc 之后)。网上确实有很多关于如何使用命令行参数的教程。你搜索过什么?你发现了什么?他们告诉你什么?
  • 如果你将命令行参数传递给你的程序,你不需要scanf()argc 告诉您命令行上有多少个参数,argv[] 将这些参数保存为以 nul 结尾的字符串。 (例如,argv[1] 是第一个参数,argv[2] 第二个,...)注意,argv[0] 始终是正在运行的程序名称。你会检查if (argc < 3) { /* error: too few args */ }。您可以使用sscanf (argv[1], "%d", &a) 转换值(同时检查返回)然后您可以switch(*argv[2]) 打开第二个参数中的第一个字符,您的情况将是'+''-'、..跨度>

标签: c printf scanf command-line-arguments


【解决方案1】:

首先,我强烈建议您查看您遇到的任何 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 数组) 位于。然后可以通过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

【讨论】:

  • 您可能需要strcmp(argv[2], "+"),否则,用户可以键入./program 1 +-*/ 2',如果您只测试第二个参数的第一个字符,则可以接受。
  • 我应该考虑到这一点,很好。我会编辑它。
【解决方案2】:
  1. char **argv。正如一些程序员老兄所说,你应该重新阅读你的书/教程。
  2. scanf 不读取参数。它从标准输入读取。
  3. 参数的类型为char*,并存储在argv 中。要将这些参数转换为整数,请使用 atoistrtol(最好是 strtol)。请参阅this 了解更多信息。
  4. 如果您想使用 scanf 从标准输入读取,那很好,只要您将数据输入标准输入,而不是作为命令行参数,您所拥有的就可以工作。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2011-08-22
  • 2016-03-18
相关资源
最近更新 更多