2012-01-22 76 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 *」。

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 
第一個等式中

if語句做的不是什麼的strcmp返回到它,所以如果兩個字符串相等,你會得到一個0也不是0是1

因此,工程節約萬噸你的時間打字。