C语言中的“传递strcmp的参数2使指针从整数而不进行强制转换”是什么意思?

What does “passing argument 2 of strcmp makes pointer from integer without a cast” error in C mean?

我正在编译我的C代码,并遇到两个错误:

warning:passing argument 2 of strcmp makes pointer from integer without a cast

warning: note: expected const char * but argument is of type int

这是我的主要:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
int main(int argc, char *argv[])
{
    //check to make sure that the command line arguments are valid  
    if(argc!=3)
    {
        printf("invalid function call try again
"
);
    }

    //else to choose the proper command
    else
    {
        //reverse routine A        
        if(strcmp(argv[2],'a'||'A')==0) //line 138
        {
            reva(argv[1]);
        }
        //reverse routine B
        else if(strcmp(argv[2],'b'||'B')==0)  //line 143
        {
            revb(argv[1]);
        }
        //reverse routine C
        else if(strcmp(argv[2],'c'||'C')==0)  //line 148
        {
            revc(argv[1]);
        }
        //unacceptable command line argumant
        else
        {
            printf("unacceptable command line argument for reverse routine try again:
"
);
        }
    }

}


这就是说的话。 'a'||'A'具体来说是整数,它是整数1strcmp的第二个参数必须是字符串,而不是整数。

您似乎打算将argv[2]aa进行比较。为此,您需要两个不同的strcmp调用。另外,您需要使用双引号而不是单引号。


在" C"中," ||"运算符是布尔"或"运算,而不是串联运算。同样,撇号的使用表示单个字符,基本上是"字符"类型。

我想你想要这样的东西(对于第148行):

1
if (strcmp(argv[2],"C")==0 || (strcmp(argv[2],"c")==0) ...

或者,如果您的C库支持它:

1
if (strcasecmp(argv[2],"C") == 0)

这是不区分大小写的比较。


我相信您在这里的目的是将命令行参数(argv [2])与字符(字符串)" C"或" c"进行比较,即您是否在命令行中给了c或C。

SO用户已经提供了解释。您需要使用

(strcmp(argv[2],"C")==0 || (strcmp(argv[2],"c")==0)

为了消除您的警告。

但是,这不是解析C中命令行参数的最佳方法。如果解析用户输入时您的程序过于复杂,我建议您使用库" getopt"。它旨在帮助用户以结构化的方式解析和分析输入。

这是一个小代码窃听器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
opt = getopt_long( argc, argv, optString, longOpts, &longIndex );
    while( opt != -1 ) {
        switch( opt ) {
            case 'I':
                globalArgs.noIndex = 1; /* true */
                break;

            case 'l':
                globalArgs.langCode = optarg;
                break;

            case 'o':
                globalArgs.outFileName = optarg;
                break;

            case 'v':
                globalArgs.verbosity++;
                break;

            case 'h':   /* fall-through is intentional */
            case '?':
                display_usage();
                break;

            case 0:     /* long option without a short arg */
                if( strcmp("randomize", longOpts[longIndex].name ) == 0 ) {
                    globalArgs.randomized = 1;
                }
                break;

            default:
                /* You won't actually get here. */
                break;
        }

        opt = getopt_long( argc, argv, optString, longOpts, longIndex );
    }

请在一些文档(或Linux手册页)中搜索getopt和getopt_long。这是来自GNU的示例。