【问题标题】:True and false in C in if statement with getopt()使用 getopt() 的 if 语句中的 C 语言中的真假
【发布时间】: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 &lt;string.h&gt;
  • 另外,a &amp;&amp; b || c 表示 (a &amp;&amp; b) || c,如果您的意图是 a &amp;&amp; (b || c),请使用括号
  • 顺便说一句,您的问题实际上与getopt 无关。我发现感谢any 的回答有点奇怪,如果答案是“您需要在没有备份的情况下格式化硬盘”怎么办?开个玩笑,不要那样做:-)
  • @paxdiablo 嗨!然后感谢您的“任何”回答:)。对不起,我不是本地人。有时,我只是从我自己的语言中复制完全正确的意思并直接翻译成英语,这在英语中可能听起来很奇怪。对此感到抱歉。说到getopt,我最近才开始学习C,我想可能是有联系的,因为实际上我想在我的“if语句”中使用getopt中的选项。

标签: c unix if-statement argv getopts


【解决方案1】:

您正在使用!= 比较两个char *s,这将比较地址。

(argv[1] != "-l")

比较字符串的方法是使用strcmp。请注意 strcmp 函数是“三进制”,如果字符串不同(以提供顺序),则返回负值或正值,如果相等则返回 0。

(strcmp(argv[1], "-l") == 0)

【讨论】:

    【解决方案2】:

    不要不要使用:

    argv[1] != "-l"
    

    要比较 C(a) 中的字符串,这会比较 char(b) 的两个数组的 地址,而不是这两个字符串的内容。 Instaed,您应该使用:

    strcmp(argv[1], "-l") == 0
    

    (a) 这是 C++ 字符串中固定的事情之一,那里的相等运算符比较字符串的内容。

    (b) 这可能有时似乎可以与"xyzzy" == "xyzzy" 之类的东西一起使用,但这只是因为允许(但不是必需)编译器折叠相同的字符串常量在一起(所以他们占用的空间更少)。当其中一个字符串不是常量时(例如在命令行上传递时),通常是不可能的。

    【讨论】:

      【解决方案3】:

      AND (&amp;&amp;) 优先于 OR (||),所以我认为 if 语句中的代码是这样解释的:
      if (((argc == 2) &amp;&amp; (argv[1] != "-l")) || (argv[1] != "-i"))
      所以它里面的逻辑总是正确的,因为即使您的选项是 -l 并且它是唯一的(选项数量!= 2),您键入的选项也不是 -i。

      【讨论】:

      • 是的,你是对的,但它也不适用于语句中的“&&”。我尝试过这个 :)。感谢您的回复和时间!
      • 不客气,无论如何,paxdiablo 明确修复了它 (;
      猜你喜欢
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 2021-12-05
      相关资源
      最近更新 更多