2012-01-22 1 views
2

Может кто-нибудь, пожалуйста, объясните мне, как правильно использовать функцию strcmp? Я создаю крестики-нолики игру, и я получаю сообщение об ошибке:Правильное использование функции 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; 
} 
+6

'mark_location (int userU, char * str)' – wildplasser

+0

Ошибка связана с вашим типом. Однако есть некоторые проблемы с вашим выбором определения того, какой переход выбрать (например, что должно произойти, если выбран недействительный ход?).Как вы думаете, вы можете превратить строки в перечисление, а затем запустить оператор switch? –

ответ

1

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

3

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

void mark_location(int userU, char *str) { 

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

Кроме того, убедитесь что вы включили string.h в верхней части файла:

#include <string.h> 
+0

Я все еще получаю ту же ошибку, и она говорит, что я неправильно использую оператор *. – user1064913

+0

Где вы положили '*'? – Mat

+0

@ user1064913: См. Мою дополнительную информацию. –

1

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

4

Как уже указывалось другими, второй аргумент должен быть типа 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 должно вызвать ошибку.

0

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

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 

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

Так это работает экономия тонн вашего времени ввода ,

Смежные вопросы