ошибка при вызове strcmp Неверное преобразование из 'int' в 'const char *' - PullRequest
2 голосов
/ 28 октября 2009

Я использую strcmp для сравнения массивов символов в c ++, но я получаю следующую ошибку для каждого вхождения strcmp: ошибка: недопустимое преобразование из 'int' в 'const char *' с последующим: error: инициализация аргумента 2 из 'int strcmp (const char *, const char *)'

Я включил string, string.h и stdio.h, и вот мой код, спасибо всем, кто отвечает.

Кроме того, есть ли лучший способ проверить буфер, кроме набора операторов if?


int main(int argc, char* argv[])
{
    unsigned count = 0;
    bool terminate = false;
    char buffer[128];</p>

<pre><code>do {
    // Print prompt and get input
    count++;
    print_prompt(count);
    cin.getline(buffer, 128);

    // check if input was greater than 128, then check for built-in commands
    // and finally execute command
    if (cin.fail()) {
        cerr << "Error: Commands must be no more than 128 characters!" << endl;
    }
    else if ( strcmp(buffer, 'hist') == 0 ) {
        print_Hist();
    }
    else if ( strcmp(buffer, 'curPid') == 0 ) {
        // get curPid
    }
    else if ( strncmp(buffer, 'cd ', 3) == 0 ) {
        // change directory
    }
    else if ( strcmp(buffer, 'quit') == 0 ) {
        terminate = true;
    }
    else {
        //run external command
    }

} while(!terminate);

return 0;

}

1 Ответ

8 голосов
/ 28 октября 2009

Ваша строка сравнения неверна. Они должны иметь форму "hist", а не 'hist'.

В C ++ 'hist' - это просто символьный литерал (как указано в разделе 2.14.3 стандарта C ++ 0x draft (n2914)), мой акцент на последнем абзаце:

Символьный литерал - это один или несколько символов, заключенных в одинарные кавычки, как, например, в 'x', необязательно перед одной из букв u, U или L, как в u'y ', U'z' или L 'x' соответственно.

Символьный литерал, который не начинается с u, U или L, является обычным символьным литералом, также называемым литералом узкого символа.

Обычный символьный литерал, содержащий один символ c-char, имеет тип char, значение которого равно числовому значению кодировки символа c-char в наборе символов выполнения.

Обычный символьный литерал, содержащий более одного символа c-char, является литералом с несколькими символами. Литерал с несколькими символами имеет тип int и значение, определяемое реализацией.

Что касается лучшего пути, это зависит от того, что вы подразумеваете под лучшим: -)

Одна из возможностей - создать таблицу функций, которая в основном представляет собой массив структур, каждая из которых содержит слово и указатель на функцию.

Затем вы просто извлекаете слово из вашей строки и выполняете поиск в этом массиве, вызывая функцию, если найдете совпадение. Следующая программа на C показывает, как использовать таблицы функций. Что касается того, является ли это лучшим решением, я оставлю это на ваше усмотрение (это умеренно продвинутая техника) - вам может быть лучше придерживаться того, что вы понимаете.

#include <stdio.h>

typedef struct {         // This type has the word and function pointer
    char *word;          // to call for that word. Major limitation is
    void (*fn)(void);    // that all functions must have the same
} tCmd;                  // signature.

// These are the utility functions and the function table itself.

void hello (void) { printf ("Hi there\n"); }
void goodbye (void) { printf ("Bye for now\n"); }

tCmd cmd[] = {{"hello",&hello},{"goodbye",&goodbye}};

// Demo program, showing how it's done.

int main (int argc, char *argv[]) {
    int i, j;

    // Process each argument.

    for (i = 1; i < argc; i++) {
        //Check against each word in function table.

        for (j = 0; j < sizeof(cmd)/sizeof(*cmd); j++) {
            // If found, execute function and break from inner loop.

            if (strcmp (argv[i],cmd[j].word) == 0) {
                (cmd[j].fn)();
                break;
            }
        }

        // Check to make sure we broke out of loop, otherwise not a avlid word.

        if (j == sizeof(cmd)/sizeof(*cmd)) {
            printf ("Bad word: '%s'\n", argv[i]);
        }
    }

    return 0;
}

При запуске с:

pax> ./qq.exe hello goodbye hello hello goodbye hello bork

вы получите вывод:

Hi there
Bye for now
Hi there
Hi there
Bye for now
Hi there
Bad word: 'bork'
...