如何检查 C 中的空字符指针
How to check for an empty character pointer in C
我最近正在使用 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 == '[=10=]'){
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”)。
我的问题在于,当用户不输入任何字符或不包含 space(strtok 中定义的定界符)的字符串时,当我尝试执行检查:
if(*move_1 == '[=11=]')
主要用于处理move_1和move_2指针为null时的异常
我有两个问题:
- 如何检查字符指针是否为空? (我已经尝试使用
move_1 == NULL)
- 如果我将条件语句设置为
if(*move_1 != 0)
,为什么代码会继续执行 returns。虽然这会导致所有输入(即使是正确的格式)无效。
如果您的意思是不输入任何字符,则表示您正在按回车键,这意味着您的条件应该是这样的:if(*move_1 == '\n')
,因为换行符中的回车符会传送到命令行,即“\n”转义符字符.
我希望我能看到你的完整项目并共同完成它...
问题 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_1
和 move_2
之后立即对它们执行相同的操作,以及在您使用它们或取消引用它们之前。 (经过进一步调查,这些检查中的一些可能被证明是不必要的,但现在我认为优先考虑的是修复所有的分段错误,这样你的程序就可以 运行 而不会崩溃。)
问题 2
听起来您将代码更改为以下内容,它开始将您的所有输入声明为无效:
if(*move_1 != '[=11=]'){
printf("invalid move !");
return;
}
好吧,对此的解释很简单。你告诉你的编译器,如果 move_1
字符串的第一个字符不是空终止字符,它应该打印“无效移动!”和 return。因此,只要 move_1
非空,它就会这样做。也许您打算使用 ==
(等于)而不是 !=
(不等于)。
我最近正在使用 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 == '[=10=]'){
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”)。
我的问题在于,当用户不输入任何字符或不包含 space(strtok 中定义的定界符)的字符串时,当我尝试执行检查:
if(*move_1 == '[=11=]')
主要用于处理move_1和move_2指针为null时的异常
我有两个问题:
- 如何检查字符指针是否为空? (我已经尝试使用
move_1 == NULL)
- 如果我将条件语句设置为
if(*move_1 != 0)
,为什么代码会继续执行 returns。虽然这会导致所有输入(即使是正确的格式)无效。
如果您的意思是不输入任何字符,则表示您正在按回车键,这意味着您的条件应该是这样的:if(*move_1 == '\n')
,因为换行符中的回车符会传送到命令行,即“\n”转义符字符.
我希望我能看到你的完整项目并共同完成它...
问题 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_1
和 move_2
之后立即对它们执行相同的操作,以及在您使用它们或取消引用它们之前。 (经过进一步调查,这些检查中的一些可能被证明是不必要的,但现在我认为优先考虑的是修复所有的分段错误,这样你的程序就可以 运行 而不会崩溃。)
问题 2
听起来您将代码更改为以下内容,它开始将您的所有输入声明为无效:
if(*move_1 != '[=11=]'){
printf("invalid move !");
return;
}
好吧,对此的解释很简单。你告诉你的编译器,如果 move_1
字符串的第一个字符不是空终止字符,它应该打印“无效移动!”和 return。因此,只要 move_1
非空,它就会这样做。也许您打算使用 ==
(等于)而不是 !=
(不等于)。