在C程序中使用arg [v]命令行参数

时间:2015-10-16 02:09:05

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

我在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数组的指针,但我不明白我是怎么回事。

3 个答案:

答案 0 :(得分:3)

在表达式

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;
}

答案 1 :(得分:1)

有两个问题。首先,您将字符串(指向字符数组的指针)与字符进行比较。这就是你收到警告的原因。其次,您将'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");
    }
}

答案 2 :(得分:1)

你可以试试这个

#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");

}