es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

  1. ¿Cómo puedo verificar si un puntero a char es nulo? (Ya he intentado usando `movimiento_1 == NULL)

  2. ¿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.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai
    1. Para comprobar si un puntero de caracteres es nulo, simplemente puedes hacer si (move_1 == NULL).
    2. Establecer la declaración condicional a si (*move_1 != 0) solo verificará si el primer carácter de move_1 no es igual a 0 (lo cual equivale al terminador nulo \0). Esto significa que no se detectará un caso en el que move_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 utilizando si (move_1 == NULL || strlen(move_1) == 0). Esto capturará ambos casos de entrada vacía y puntero nulo y los manejará adecuadamente.

Comments are closed.