所以我必须编写一个程序,其中包含两个可能的选项,具体取决于用户通过输入 -i 或 -w 选择的内容。一般来说,我对命令行参数非常陌生,我不知道如何做到这一点。到目前为止我已经:
#include <stdio.h>
int main(int argc, char *argv[])
{
if(argc == -'i') {
puts("Test 1");
}
else if(argc == -'w') {
puts("Test 2");
}
return 0;
}
它不打印任何内容... 任何解释将不胜感激。我只是想理解这背后的逻辑。
最佳答案
首先,您正在将橙子与苹果进行比较。 argc
存储的数量
论据。其次,即使您使用 argv[1]
,比较仍然是
错误,因为它将比较指针,而不是内容。请注意,在 C 中
字符串是一个以 '\0'
终止字节的字符序列。
char* 变量仅指向该序列的开头。 ==
运算符
检查值的相等性,如果是指针(和字符串文字),它
比较两个指针是否指向同一位置。
当你想比较字符串时,你必须比较字符串本身,
这意味着您必须比较指针指向的内容。
对于字符串,您必须使用 strcmp
功能如下:
#include <stdio.h>
int main(int argc, char *argv[])
{
if(argc != 2)
{
fprintf(stderr, "usage: %s option\n", argv[0]);
return 1;
}
if(strcmp(argv[1], "-i") == 0)
puts("Test 1");
else if(strcmp(argv[1], "-w") == 0)
puts("Test 2");
else {
fprintf(stderr, "Invalid option '%s'\n", argv[1]);
return 1;
}
return 0;
}
请注意,首先检查您是否有足够的命令行非常重要
参数(我的代码的第一个 if
)。如果用户没有传递任何参数,
argc
将为 1,argv[1]
将指向 NULL
,这将产生 undefined
传递给 strcmp
时的行为。这就是为什么我只在以下情况下才执行 strcmp
100% 确定 argv[1]
不是 NULL
。
此外,如果您正在为 POSIX 系统(linux、mac 等)编码,那么我建议使用
getopt
用于解析命令行参数。
关于具有选项的命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49991093/