Cómo verificar un puntero de carácter vacío en C.
Recientemente estoy trabajando en un juego de ajedrez simple en la terminal utilizando C, pero me enfrenté a un pequeño problema en relación con la entrada del usuario.
La siguiente función recibe un arreglo tridimensional que contiene la posición actual de las piezas de ajedrez, un puntero a un búfer que contendrá la entrada del usuario y el tamaño de este búfer que establecí en 7.
void proximo_movimiento(char tablero[8][8][4], char* movimiento, tamaño buff_size){
char *movimiento_1 = (char*) malloc(sizeof(char)*3);
char *movimiento_2 = (char*) malloc(sizeof(char)*3);
char delim[] = " ";
getline(&movimiento, &buff_size, stdin);
movimiento_1 = strtok(movimiento, delim);
movimiento_2 = strtok(NULL, delim);
if(*movimiento_1 == '\0'){
printf("¡Movimiento inválido!");
return;
}
printf("%s%s\n", movimiento_1, movimiento_2);
if(!verificar_movimiento(tablero, movimiento_1, movimiento_2)){
printf("¡Movimiento válido!\n");
}
}
La función verificar_movimiento recibe ambos movimientos ingresados por el usuario y verifica si son movimientos válidos de ajedrez (por ejemplo, “Nb1 Nc3”).
Mi problema radica en el hecho de que cuando el usuario no ingresa ningún carácter o una cadena de caracteres que no contiene un espacio (delimitador definido en strtok), se produce una violación de segmento cuando intento hacer la comprobación:
if(*movimiento_1 == '\0')
Esto se usa principalmente para manejar la excepción en caso de que los punteros movimiento_1 y movimiento_2 sean nulos.
Tengo dos preguntas:
-
¿Cómo puedo verificar si un puntero a char es nulo? (Ya he intentado usando `movimiento_1 == NULL)
-
¿Por qué el código sigue ejecutándose y devuelve si establezco el enunciado condicional en
if(*movimiento_1 != 0)
? Aunque esto hace que todas las entradas (incluso si tienen el formato correcto) no sean válidas.
davy.ai
si (move_1 == NULL)
.Establecer la declaración condicional a
si (*move_1 != 0)
solo verificará si el primer carácter demove_1
no es igual a 0 (lo cual equivale al terminador nulo\0
). Esto significa que no se detectará un caso en el quemove_1
esté completamente vacío o nulo. En este caso, el código continuará su ejecución y resultará en una falla de segmentación cuando se haga referencia a*move_1
.Para solucionar este problema y evitar una falla de segmentación, puedes modificar la declaración condicional para verificar si
move_1
es nulo o si está vacío utilizandosi (move_1 == NULL || strlen(move_1) == 0)
. Esto capturará ambos casos de entrada vacía y puntero nulo y los manejará adecuadamente.