我最近正在使用 C 在終端上進行簡單的國際象棋游戲,但在獲取用戶輸入方面遇到了一個小問題。
以下函式接收一個包含當前棋子位置的 3 維陣列、一個指向包含用戶輸入的緩沖區的指標以及我設定為 7 的緩沖區大小。
void next_move(char board[8][8][4], char* move, size_t buff_size){
char * move_1 = (char )malloc(sizeof(char)3);
char * move_2 = (char )malloc(sizeof(char)3);
char delim[]=" ";
getline(&move,&buff_size,stdin);
move_1=strtok(move,delim);
move_2=strtok(NULL,delim);
if(*move_1 == '\0'){
printf("invalid move !");
return ;
}
printf("%s%s\n",move_1,move_2);
if(!check_move(board, move_1, move_2)){
printf("valid move !\n");
}
}
函式 check_move 接受用戶輸入的兩個走法并驗證它們是否是有效的國際象棋走法(例如“Nb1 Nc3”)。
我的問題在于,當用戶不輸入任何字符或一串不包含空格的字串(strtok 中定義的分隔符)時,當我嘗試進行檢查時會導致分段錯誤:
if(*move_1 == '\0')
主要用于處理move_1和move_2指標為空時的例外。
我有兩個問題:
- 如何檢查字符指標是否為空?(我已經嘗試使用
move_1 == NULL) - 如果我將條件陳述句設定為
if(*move_1 != 0). 盡管這會導致所有輸入(即使格式正確)都無效。
uj5u.com熱心網友回復:
問題 1
聽起來可能move是 NULL,但您的第一次呼叫strtok應該有一個非 NULL 指標。因此,在您致電之后getline,我認為您應該檢查以確保move不是 NULL。檢查它move_1并且move_2不為 NULL也是一個好主意。您可以使用以下代碼進行這些檢查:
getline(&move,&buff_size,stdin);
if (move == NULL) {
// handle this case, probably with an early return
}
請注意,上面的代碼僅顯示了對 的檢查move,但我認為您可能應該在分配給它們之后以及在使用它們或取消參考它們之前對move_1and做同樣的事情move_2。(經過進一步調查,其中一些檢查可能是不必要的,但就目前而言,我認為首要任務是修復所有分段錯誤,以便您的程式可以運行而不會崩潰。)
問題2
聽起來您將代碼更改為以下內容,并開始將所有輸入宣告為無效:
if(*move_1 != '\0'){
printf("invalid move !");
return;
}
嗯,對此的解釋很簡單。您告訴編譯器,如果move_1字串的第一個字符不是空終止字符,則它應該列印“無效移動!” 并回傳。因此,只要move_1非空,它就會這樣做。也許您打算使用==(equal) 而不是!=(not equals)。
uj5u.com熱心網友回復:
如果您的意思是不輸入任何字符并按下 Enter 鍵,則意味著您的條件應該是:if(*move_1 == '\n'),因為 Enter in a new line feed 命令列是 '\n' 轉義字符。
我希望我能看到你的完整專案并共同完成它......
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/404656.html
標籤:
