Что означает ошибка «передача аргумента 2 из strcmp делает указатель из целого числа без приведения» в C? - PullRequest
1 голос
/ 20 января 2012

Я компилирую код C и получаю две ошибки:

предупреждение: передача аргумента 2 из strcmp делает указатель из целого числа без приведения

и

предупреждение: примечание: ожидается const char *, но аргумент имеет тип int

Это мой главный:

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\n");
    }

    //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:\n");
        }
    }

}

Ответы [ 3 ]

6 голосов
/ 20 января 2012

Это означает, что это говорит. 'a'||'A' - это целое число & ndash; в частности, это целое число 1. Второй аргумент strcmp должен быть строкой, а не целым числом.

Похоже, вы намереваетесь сравнить argv[2] с a и A. Вам нужны два разных strcmp звонка для этого. Также вам нужно использовать двойные, а не одинарные кавычки.

3 голосов
/ 20 января 2012

В "C", '||'operator - логическая операция 'или', а не операция конкатенации.Кроме того, использование апострофов обозначает один символ, который в основном имеет тип char.

Я думаю, вы хотите что-то вроде этого (для строки 148): if (strcmp (argv [2], "C") == 0 || (strcmp (argv [2], "c") == 0) ...

или, если ваша библиотека C поддерживает это: if (strcasecmp (argv [2], "C")) == 0) это сравнение без учета регистра

1 голос
/ 21 января 2012

Я считаю, что ваш объект здесь для сравнения аргумента командной строки (argv [2]) с символом (строкой) "C" или "c", т.е. вы просто, если пользователь дал c или C в командной строке.

Пользователи SO уже предложили объяснение.Вам нужно использовать

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

, чтобы исключить ваше предупреждение.

Однако это не оптимальный способ разбора аргументов командной строки в C. Если ваша программа слишком сложна при анализе пользовательского ввода, я бы предложил использоватьБиблиотека "Getopt". Она предназначена для того, чтобы помочь пользователю анализировать и анализировать структурированный ввод.

Вот небольшой фрагмент кода

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, amp;longIndex );
    }

Пожалуйста, найдите некоторые документы (илиman-страницы linux) для getopt и getopt_long. Вот пример из GNU .

...