如何检查 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时的异常

我有两个问题:

  1. 如何检查字符指针是否为空? (我已经尝试使用 move_1 == NULL)
  2. 如果我将条件语句设置为 if(*move_1 != 0),为什么代码会继续执行 returns。虽然这会导致所有输入(即使是正确的格式)无效。

如果您的意思是不输入任何字符,则表示您正在按回车键,这意味着您的条件应该是这样的:if(*move_1 == '\n'),因为换行符中的回车符会传送到命令行,即“\n”转义符字符.
我希望我能看到你的完整项目并共同完成它...

问题 1

听起来 move 可能是 NULL,但您对 strtok 的第一次调用应该有一个非 NULL 指针。因此,在您调用 getline 之后,我认为您应该检查以确保 move 不为 NULL。检查 move_1move_2 是否不为 NULL 也是一个好主意。您可以使用如下代码进行这些检查:

getline(&move,&buff_size,stdin);
if (move == NULL) {
  // handle this case, probably with an early return
}

请注意,上面的代码仅显示了对 move 的检查,但我认为您应该在分配给 move_1move_2 之后立即对它们执行相同的操作,以及在您使用它们或取消引用它们之前。 (经过进一步调查,这些检查中的一些可能被证明是不必要的,但现在我认为优先考虑的是修复所有的分段错误,这样你的程序就可以 运行 而不会崩溃。)

问题 2

听起来您将代码更改为以下内容,它开始将您的所有输入声明为无效:

if(*move_1 != '[=11=]'){
  printf("invalid move !");
  return;
}

好吧,对此的解释很简单。你告诉你的编译器,如果 move_1 字符串的第一个字符不是空终止字符,它应该打印“无效移动!”和 return。因此,只要 move_1 非空,它就会这样做。也许您打算使用 ==(等于)而不是 !=(不等于)。