Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带getopt()的if语句中的C中的True和false_C_Unix_If Statement_Argv_Getopts - Fatal编程技术网

带getopt()的if语句中的C中的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

当我使用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)
        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已经清楚地修复了它(;是的,你是对的,但它仅在语句内部对“&&&”无效。我尝试了:).谢谢你的回复和时间!不客气,不管怎样,帕西迪亚布洛显然已经把它修好了(;