正确使用strcmp功能?

时间:2012-01-22 19:04:42

标签: c 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;
}

5 个答案:

答案 0 :(得分: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的无效值是否应该引发错误也是值得考虑的。

答案 1 :(得分:3)

将您的函数声明更改为以下内容:

void mark_location(int userU, char *str) {

请注意从char(单个字符)到char *(字符串)的更改。

另外,请确保您已将string.h添加到文件顶部:

#include <string.h>

答案 2 :(得分:1)

在函数参数中,您已将“str”声明为“char”。它应该是“char *”。

答案 3 :(得分:1)

strcmp需要一个指向字符数组的指针,但str被声明为单个字符,应该是char*

答案 4 :(得分: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

在第一个等式中if语句执行任何strcmp返回的NOT,所以如果字符串相等,你将得到0而NOT 0是1

这样可以节省大量的时间输入。