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.

¿La función trim reduce a la mitad el tamaño de la memoria para eliminar los espacios en blanco?

Tengo que crear una función (función de recorte) que pueda realizar esta tarea: tomar una cadena terminada en nulo y, si en la posición cero de la cadena hay un espacio en blanco, eliminar ese espacio en blanco. Lo mismo si el espacio en blanco está al final de la cadena (antes del terminador cero). Por lo tanto, básicamente, la función ignora los espacios en blanco en el medio de la cadena.

Esto es lo que intenté hacer hasta ahora:
(1) Pasé la cadena ” a b ” a la función de recorte.
(2) (verificación de puntero nulo).
(3) Tomé la longitud de la cadena usando la función strlen.

(4) (esta es la parte delicada, porque al depurar línea por línea, encontré un error extraño dentro del bucle for).

El error es el siguiente: cuando el depurador ejecuta la primera línea del bucle for, entra en el bucle como se esperaba; bien, eso está bien, pero cuando el depurador ejecuta la comprobación if, debería ser verdadero (porque al principio de la cadena hay un espacio en blanco) y se supone que la función debe entrar en el cuerpo del if, en la primera instrucción if, y volver a asignar la memoria. Pero eso no es cierto, porque realloc nunca se ejecuta. ¿Por qué?

(La función debe devolver el puntero a la memoria reasignada).

Otro error es que ” s ” no está inicializado pero lo usé de todos modos, y eso no es cierto porque inicialicé s con la cadena ” a b “.

char* trim(const char* s) {    
    if (s == NULL) {  
        return NULL; 
    } 
    size_t length = strlen(s);
    for (unsigned int i = 0; s[i] != '\0'; i++) { 
        if (s[i] == ' ') {
            realloc(s, length - sizeof(char));       
        } 
    }
    return s; 
}
int main(void) {
    trim(" a b ");
    return 0; 
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hay algunas problemas con el código proporcionado para la función de recorte.

    En primer lugar, la sentencia “if” en el ciclo “for” debería comprobar un carácter de espacio (‘ ‘), no una cadena (” “).

    En segundo lugar, la función realloc debe asignarse a una nueva variable de puntero, y el puntero original debe ser liberado antes de devolver el nuevo puntero.

    En tercer lugar, la memoria asignada debe aumentarse en tamaño por un byte para que haya espacio para el terminador nulo al final de la cadena recortada.

    Aquí hay una versión revisada del código con estos cambios:

    #include <stdlib.h>
    #include <string.h>
    
    char* trim(const char* s) {
        if (s == NULL) {
            return NULL;
        }
        size_t length = strlen(s);
        if (length == 0) {
            return strdup("");
        }
        char* trimmed = malloc(length + 1);
        if (!trimmed) {
            return NULL;
        }
        size_t start = 0;
        size_t end = length - 1;
        while (s[start] == ' ') {
            start++;
        }
        while (end > start && s[end] == ' ') {
            end--;
        }
        strncpy(trimmed, &s[start], end - start + 1);
        trimmed[end - start + 1] = '\0';
        return trimmed;
    }
    
    int main(void) {
        char* result = trim(" a b ");
        if (result) {
            printf("%s\n", result);
            free(result);
        }
        return 0;
    }
    

    En esta versión revisada, la función utiliza un índice de inicio y fin para determinar el rango de caracteres que no son espacios en la cadena de entrada. Luego crea una nueva cadena con el rango recortado y la devuelve. La función main muestra un ejemplo de uso y libera la memoria asignada cuando se termina.</string.h></stdlib.h>

Comments are closed.