带getopt()的if语句中的C中的True和false
当我使用argv&getopt时,我很难理解“if语句”是如何使用“true”和“false”的 以下是简单的代码:带getopt()的if语句中的C中的True和false,c,unix,if-statement,argv,getopts,C,Unix,If Statement,Argv,Getopts,当我使用argv&getopt时,我很难理解“if语句”是如何使用“true”和“false”的 以下是简单的代码: #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) sw
#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]);
}
输出:
Without option -l or -i but with other argument
argv[1] is foo
./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
到目前为止还不错。现在让我检查当argv[1]为“-l”时它是否工作:
用法:
./a.out foo
./a.out -l
输出:
Without option -l or -i but with other argument
argv[1] is foo
./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.不要使用:
为了比较C(a)中的字符串,这将比较两个char
(b)数组的地址,而不是这两个字符串的内容。Instaed,您应该使用:
strcmp(argv[1], "-l") == 0
(a)这是C++字符串中固定的东西之一,那里的相等操作符比较字符串的内容。
(b) 这有时似乎适用于类似于“xyzzy”==“xyzzy”
的情况,但这只是因为编译器允许(但不是必需的)将相同的字符串常量折叠在一起(因此它们占用的空间较小)。当其中一个字符串不是常量时(例如在命令行上传递时),通常不可能执行此操作。请勿使用:
为了比较C(a)中的字符串,这将比较两个char
(b)数组的地址,而不是这两个字符串的内容。Instaed,您应该使用:
strcmp(argv[1], "-l") == 0
(a)这是C++字符串中固定的东西之一,那里的相等操作符比较字符串的内容。
(b) 这有时似乎适用于类似于
“xyzzy”==“xyzzy”
的情况,但这只是因为编译器允许(但不是必需的)将相同的字符串常量折叠在一起(因此它们占用的空间较小)。当其中一个字符串不是常量时(例如在命令行上传递该字符串时),通常是不可能的。您正在使用比较两个char*
s=代码>这将比较地址
(argv[1] != "-l")
比较字符串的方法是使用strcmp
。请注意,strcmp
函数是“三元函数”,如果字符串不同(以提供顺序),则返回负值或正值;如果字符串相等,则返回0
(strcmp(argv[1],“-l”)==0)
您正在使用比较两个字符*
=代码>这将比较地址
(argv[1] != "-l")
比较字符串的方法是使用strcmp
。请注意,strcmp
函数是“三元函数”,如果字符串不同(以提供顺序),则返回负值或正值;如果字符串相等,则返回0
(strcmp(argv[1],“-l”)==0)
,(&&&
)优先于OR(|
),因此我认为if
语句中的代码是这样解释的:if((argc==2)和((argv[1]!=“-l”))| |(argv[1]!“-I”)
,所以它内部的逻辑总是正确的,因为即使您的选项是-l
,并且是唯一的(选项数!=2),您输入的选项也不是-i
,并且(&&
)优先于OR(|
),所以我认为if
语句中的代码是这样解释的:if((argc==2)和()[1] !=“-l”))|(argv[1]!=“-i”)
所以它内部的逻辑总是正确的,因为即使您的选项是-l
,并且它是唯一的(选项数!=2)同样,您键入的选项不是-i
使用strcmp
来比较字符串,而不是!=
。您将需要#包括,a和&b|c
表示(a和&b)| c
,如果您的意图是a和(b)| c,请使用括号
似乎是一个旁白,你的问题实际上与getopt
无关。我觉得感谢任何答案有点奇怪,如果答案是“你需要格式化你的硬盘而不需要备份”?只是开玩笑,不要这样做:-@paxdiablo嗨!谢谢你的“任何”然后回答:)。对不起,我不是本地人。有时候,我只是从我自己的语言中复制一些完全正确的词义,然后直接翻译成英语,这在英语中可能听起来很奇怪。很抱歉。说到getopt,我最近才开始学C,我想可能是因为在fa中ct我想在我的“if语句”中使用getopt中的选项。使用strcmp
来比较字符串,而不是!=
。您还需要#包括,a和&b|c
表示(a和b)| c
,如果您的意图是a和(b|c),请使用括号
似乎是一个旁白,你的问题实际上与getopt
无关。我觉得感谢任何答案有点奇怪,如果答案是“你需要格式化你的硬盘而不需要备份”?只是开玩笑,不要这样做:-@paxdiablo嗨!谢谢你的“任何”然后回答:)。对不起,我不是本地人。有时候,我只是从我自己的语言中复制一些完全正确的词义,然后直接翻译成英语,这在英语中可能听起来很奇怪。很抱歉。说到getopt,我最近才开始学C,我想可能是因为在fa中ct我想在我的“if语句”中使用getopt中的选项。是的,你是对的,但它仅在语句内部对“&&”无效。我尝试了:)。感谢你的回复和时间!不客气,反正paxdiablo已经清楚地修复了它(;是的,你是对的,但它仅在语句内部对“&&&”无效。我尝试了:).谢谢你的回复和时间!不客气,不管怎样,帕西迪亚布洛显然已经把它修好了(;