Правильное использование функции strcmp? - PullRequest
2 голосов
/ 22 января 2012

Может кто-нибудь объяснить, как правильно использовать функцию strcmp? Я создаю игру в крестики-нолики и получаю сообщение об ошибке:

passing argument 1 of ‘strcmp’ makes pointer from integer without a cast

Я создал два указателя, которые действуют как параметры для функции strcmp. Одним из них является ввод, который вводит игрок, вторым - выбор ходов игрока. Однако, когда я пытаюсь запустить код, я получаю сообщение об ошибке выше. Ниже приведен фрагмент моего кода:

void mark_location(int userU, char str) {
    char *moves[] = {"upperLeft", "up", "upperRight", "left", "center", "right", "lowerLeft", "down", "lowerRight"};

    if (strcmp(str, moves[0]) == 0)
        board[0][0] = userU;
    else if (strcmp(str, moves[1]) == 0)
        board[0][1] = userU;
    else if (strcmp(str, moves[2]) == 0)
        board[0][2] = userU;
    else if (strcmp(str, moves[3]) == 0)
        board[1][0] = userU;
    else if (strcmp(str, moves[4]) == 0)
        board[1][1] = userU;
    else if (strcmp(str, moves[5]) == 0)
        board[1][2] = userU;
    else if (strcmp(str, moves[6]) == 0)
        board[2][0] = userU;
    else if (strcmp(str, moves[7]) == 0)
        board[2][1] = userU;
    else if (strcmp(str, moves[8]) == 0)
        board [2][2] = userU;
}

Ответы [ 5 ]

4 голосов
/ 22 января 2012

Как уже указывали другие, второй аргумент должен иметь тип char*, а не char.

Я просто хотел упомянуть, что серию операторов if можно переписать в виде цикла for:

void mark_location(int userU, char* str) {
    char *moves[] = {"upperLeft", "up", "upperRight", "left", "center", "right", "lowerLeft", "down", "lowerRight"};
    int i;
    for (i = 0; i < 9; i++) {
        if (strcmp(str, moves[i]) == 0) {
            board[i / 3][i % 3] = userU;
            break;
        }
    }
}

Возможно, стоит подумать, имеет ли смысл переинициализировать moves каждый раз, когда вызывается функция, и должно ли неверное значение str вызывать ошибку.

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

Измените объявление функции на следующее:

void mark_location(int userU, char *str) {

Обратите внимание на изменение с char (один символ) на char * (строка).

Также убедитесь, что вы указали string.h в верхней части файла:

#include <string.h>
1 голос
/ 22 января 2012

strcmp ожидает указатель на массив символов, но str объявляется как один символ, когда оно должно быть char*.

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

В аргументах функции вы объявили "str" ​​как "char".Это должно быть "char *".

0 голосов
/ 23 января 2012

Попробуйте сделать это:

for (i = 0; i < 9; i++) {
    if (!strcmp(*str, *moves[i]) ) {
        board[i / 3][i % 3] = userU;
        break;
    }
}

Еще одна вещь для экономии усилий при наборе:

strcmp() возвращает 0, когда строки совпадают, поэтому при записи, что в операторе управления предпочитают писать

if(!strcmp(hello, world)){/* do this do that*/}.....1

вместо записи

if(strcmp(hello, world)==0){/* do this do that*/}......2

в первом уравнении оператор if делает НЕ из того, что strcmp возвращает к нему, так что если строки равны, вы получите 0 иNOT 0 - это 1

Так что это работает, экономя тонны вашего времени при наборе текста.

...