【发布时间】:2018-11-19 00:30:47
【问题描述】:
当我使用 argv 和 getopt 时,我很难理解真假如何与“if 语句”一起使用。
这是简单的代码:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt (argc, argv, "i:l:")) != -1)
switch (opt) {
case 'i':
printf("This is option i");
break;
case 'l':
printf("This is option l");
break;
default:
fprintf(stderr,"Usage: %s here goes usage\n",argv[0]);
}
if (argc == 1) {
printf("Without options");
}
if ((argc == 2) && (argv[1] != "-l") || (argv[1] != "-i")) {
printf("Without option -l or -i but with other argument \n");
printf("argv[1] is %s\n", argv[1]);
}
用法:
./a.out foo
输出:
Without option -l or -i but with other argument
argv[1] is foo
到目前为止还不错。现在让我检查一下当 argv[1] 为“-l”时它是否有效:
用法:
./a.out -l
输出:
./a.out: option requires an argument -- 'l'
Usage: ./a.out here goes usage
Without option -l or -i but with other argument
argv[1] is -l
Getopt 工作正常,但即使 argv[1] 为 -l 并且我在“if”语句中设置 (argv[1] != "-l"),也会出现第二个信息。为什么它会这样工作?我不知道。
感谢您的任何回答。 B.
【问题讨论】:
-
使用
strcmp比较字符串,而不是!=。你需要#include <string.h> -
另外,
a && b || c表示(a && b) || c,如果您的意图是a && (b || c),请使用括号 -
顺便说一句,您的问题实际上与
getopt无关。我发现感谢any 的回答有点奇怪,如果答案是“您需要在没有备份的情况下格式化硬盘”怎么办?开个玩笑,不要那样做:-) -
@paxdiablo 嗨!然后感谢您的“任何”回答:)。对不起,我不是本地人。有时,我只是从我自己的语言中复制完全正确的意思并直接翻译成英语,这在英语中可能听起来很奇怪。对此感到抱歉。说到getopt,我最近才开始学习C,我想可能是有联系的,因为实际上我想在我的“if语句”中使用getopt中的选项。
标签: c unix if-statement argv getopts