![](/img/trans.png)
[英]How are filenames stored when they're passed as command line arguments in 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 中的所有字符串都应以空终止符结尾,该终止符可以由NULL
、 0
或'\\0'
值表示。 这将代表字符串的结尾,许多 C 函数依靠它来知道何时停止。 此外NULL
从技术上讲是一个 C 宏,但您不需要将其与0
区别对待,因为它实际上只是扩展为0
。
char **argv
。 正如一些程序员说的那样,你应该重读你的书/教程。scanf
不读取参数。 它从标准输入读取。char*
并存储在 argv 中。 要将这些参数转换为整数,请使用atoi
或strtol
(最好是 strtol)。 有关更多信息,请参阅此内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.