【问题标题】:Using arg[v] command line arguments in a C program在 C 程序中使用 arg[v] 命令行参数
【发布时间】:2016-01-14 16:09:32
【问题描述】:

我正在用 C 语言编写一个带有多个命令行参数的程序。 argv[1] 将是单个字符“选项”,可以是“a”或“b”或“c”,每个选项都会导致程序以不同的方式运行。我想以 if 语句开始我的程序的 main() 方法,该语句检查用户在命令行上指定的选项是否正确,即“a”或“b”或“c”,仅此而已.

我的代码:

int main (int argc, char *argv[])
{
    if (argv[1] != 'a' || 'b' || 'c') printf("Failure\n");
    else printf("Success\n");
}

当我编译这段代码时,我收到了这个警告:

warning: comparison between pointer and integer

我知道我误用了指向 char 数组的指针,但我不明白我是怎么回事。

【问题讨论】:

    标签: c pointers if-statement command-line-arguments argv


    【解决方案1】:

    在表达式中

    if (argv[1] != 'a' || 'b' || 'c')
    

    argv[1] 的类型为char*'a' 的类型为char,编译器将其转换为int。这解释了编译器警告消息。

    那条线不会按照你想要的方式工作。你需要这样的东西:

    if (argv[1][0] != 'a' &&
        argv[1][0] != 'b' &&
        argv[1][0] != 'c')
    {
       printf("Failure\n");
    }
    

    为了让程序更健壮,你需要先检查是否有参数,然后再检查它的内容。

    int main (int argc, char *argv[])
    {
       if ( argc > 1 )
       {
          if (argv[1][0] != 'a' &&
              argv[1][0] != 'b' &&
              argv[1][0] != 'c')
          {
             printf("Failure\n");
          }
          else
          {
             printf("Success\n");
          }
       }
       else
       {
          printf("Failure\n");
       }
    
       return 0;
    }
    

    【讨论】:

    • 感谢错误的解释,有道理。代码的 [0] 部分是做什么的?
    • @user3413460,如果你用program abcd调用程序,那么argv[1]是字符串"abcd"argv[1][0]是该字符串的第一个字符,即'a'
    • 我会写 if ( argc > 1 && strlen(argv[1]) > 0 ) 以迎合 ./a.out "" 的情况,尽管在这些情况下你可能会争辩说 argv[1][0] 持有 '\0'。
    【解决方案2】:

    有两个问题。首先,您将字符串(指向字符数组的指针)与字符进行比较。这就是您收到警告的原因。其次,您将 'b''c' 评估为布尔表达式。你实际上想要:

    #include<stdio.h>
    #include<string.h>
    int main (int argc, char *argv[]) {
        if (  strcmp(argv[1], "a") != 0 // strcmp returns 0 on match.
           && strcmp(argv[1], "b") != 0
           && strcmp(argv[1], "c") != 0) {
            printf("Failure\n");
        } else {
            printf("Success\n");
        }
    }
    

    或者,

    #include<stdio.h>
    int main (int argc, char *argv[]) {
        // the first character is between a and c inclusive and the
        // second character is a null byte (the end of the string).
        if ('a' <= argv[1][0] && argv[1][0] <= 'c' && argv[1][1] == 0) {
            printf("Success\n");
        } else {
            printf("Failure\n");
        }
    }
    

    【讨论】:

      【解决方案3】:

      你可以试试这个

      #include <usual.h>
      
      int main (int argc, char *argv[])
      {
          char in;
          in=*argv[1];
      
          if ( in == 'a' || in =='b' || in == 'c') printf("Success\n");
              else
              printf("Failure\n");
      
      }
      

      【讨论】:

        猜你喜欢
        • 2012-08-30
        • 2016-02-22
        • 2012-04-17
        • 1970-01-01
        • 2013-04-25
        • 1970-01-01
        • 1970-01-01
        • 2018-10-05
        相关资源
        最近更新 更多