在 C 语言中使用 getopt() 的 if 语句中的 True 和 False
True and false in C in if statement with getopt()
当我使用 argv 和 getopt 时,我很难理解 true 和 false 如何与 "if statement" 一起工作。
这是简单的代码:
#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.
不使用:
argv[1] != "-l"
比较C(a)中的字符串,这个比较addresses两个数组char
[=26] =](b) 而不是这两个字符串的 contents。 Instaed,你应该使用:
strcmp(argv[1], "-l") == 0
(a) 这是 C++ 字符串中固定的东西之一,那里的相等运算符比较字符串的内容。
(b) 这可能 有时 似乎可以使用 "xyzzy" == "xyzzy"
之类的东西,但这只是因为允许编译器(但不是必需的)将相同的字符串常量折叠在一起(因此它们占用的空间更少)。当其中一个字符串不是常量时(例如当它在命令行上传递时),通常是不可能的。
您使用 !=
比较两个 char *
,这是比较地址。
(argv[1] != "-l")
比较字符串的方法是使用strcmp
。请注意,strcmp
函数是 "trinary",如果字符串不同(以提供顺序),returns 是负值或正值,如果相等,则 0
。
(strcmp(argv[1], "-l") == 0)
AND (&&
) 优先于 OR (||
),所以我认为 if
语句中的代码是这样解释的:
if (((argc == 2) && (argv[1] != "-l")) || (argv[1] != "-i"))
所以它里面的逻辑总是正确的,因为即使你的选项是 -l
并且它是唯一的(选项的数量!= 2)你输入的选项也是正确的不是 -i
.
当我使用 argv 和 getopt 时,我很难理解 true 和 false 如何与 "if statement" 一起工作。
这是简单的代码:
#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.
不使用:
argv[1] != "-l"
比较C(a)中的字符串,这个比较addresses两个数组char
[=26] =](b) 而不是这两个字符串的 contents。 Instaed,你应该使用:
strcmp(argv[1], "-l") == 0
(a) 这是 C++ 字符串中固定的东西之一,那里的相等运算符比较字符串的内容。
(b) 这可能 有时 似乎可以使用 "xyzzy" == "xyzzy"
之类的东西,但这只是因为允许编译器(但不是必需的)将相同的字符串常量折叠在一起(因此它们占用的空间更少)。当其中一个字符串不是常量时(例如当它在命令行上传递时),通常是不可能的。
您使用 !=
比较两个 char *
,这是比较地址。
(argv[1] != "-l")
比较字符串的方法是使用strcmp
。请注意,strcmp
函数是 "trinary",如果字符串不同(以提供顺序),returns 是负值或正值,如果相等,则 0
。
(strcmp(argv[1], "-l") == 0)
AND (&&
) 优先于 OR (||
),所以我认为 if
语句中的代码是这样解释的:
if (((argc == 2) && (argv[1] != "-l")) || (argv[1] != "-i"))
所以它里面的逻辑总是正确的,因为即使你的选项是 -l
并且它是唯一的(选项的数量!= 2)你输入的选项也是正确的不是 -i
.