【发布时间】:2022-01-05 19:36:38
【问题描述】:
我最近正在使用 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指针为空的情况下处理异常。
我有两个问题:
- 如何检查 char 指针是否为空? (我已经尝试过使用
move_1 == NULL) - 如果我将条件语句设置为
if(*move_1 != 0),为什么代码会继续执行并返回。虽然这会导致所有输入(即使格式正确)都无效。
【问题讨论】:
-
很好奇,为什么要为棋盘使用 3D 数组?写 3D 国际象棋?
-
sizeof(char)3-- 这个错字出现在你的实际代码中吗?请注意提供Minimal, Reproducible Example。您的演员表也不正确(和not necessary)。将缓冲区重新分配给strtok的返回值肯定会泄漏内存。 -
将
if(*move_1 == '\0')更改为if(move_1 == '\0') -
另外,如果 move_1 为 NULL,则不能为 move_2 调用 strtok。
-
是的,如果您可以提供minimal reproducible example,您会得到更好的答案,因为这样我们就不必猜测可能出了什么问题,我们可以让您的代码在我们的在将其作为答案提交之前拥有自己的机器。
标签: c string pointers segmentation-fault char