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