在 C 程序中使用 arg[v] 命令行参数
Using arg[v] command line arguments in a C program
我正在用 C 语言编写一个程序,它接受多个命令行参数。 argv[1] 将是单个字符 "option",'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数组的指针,但我不明白我是怎么回事。
表达式中
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;
}
有两个问题。首先,您将字符串(指向字符数组的指针)与字符进行比较。这就是您收到警告的原因。其次,您正在评估 '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");
}
}
你可以试试这个
#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");
}
我正在用 C 语言编写一个程序,它接受多个命令行参数。 argv[1] 将是单个字符 "option",'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数组的指针,但我不明白我是怎么回事。
表达式中
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;
}
有两个问题。首先,您将字符串(指向字符数组的指针)与字符进行比较。这就是您收到警告的原因。其次,您正在评估 '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");
}
}
你可以试试这个
#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");
}