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.

Pasando un arreglo de cadenas a una función para leer desde la entrada estándar.

¡Este código me está poniendo nervioso!

Tengo una función llamada por el programa principal que debería leer de una entrada en un array (ArrayStr) de [5] [20] (cinco palabras de un máximo de 20 caracteres cada una).

Pero se bloquea en gets o scanf o fgets.

“`C
#include <stdio.h>

const int MAX_CHARS_STRING = 20;
const int MAX_STRINGS = 5;

int ReadStrings (char **ArrayStr) {
int string_pos = 0;

<pre><code>while (string_pos < MAX_STRINGS) {
gets(ArrayStr[string_pos]);
string_pos++;
}
return 1;
</code></pre>

}

int main()
{
int err = 0;
char ArrayStrings[MAX_STRINGS][MAX_CHARS_STRING];
err = ReadStrings (ArrayStrings);
err = WriteStrings (ArrayStrings);
return 0;
}
“`</stdio.h>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay algunos problemas con el código proporcionado que pueden estar causando que se bloquee al leer la entrada en el arreglo.

    En primer lugar, la función ReadStrings toma como parámetro ArrayStr, que es un puntero a un arreglo de punteros de caracteres. Sin embargo, en la función main, se declara en su lugar un arreglo de arreglos. Esto significa que la función ReadStrings está recibiendo el tipo equivocado de parámetro y puede estar escribiendo en memoria a la que no debiera y así ocasionar el bloqueo.

    Para solucionar esto, la función main debería declarar un arreglo de punteros de caracteres, así:

    char *ArrayStrings[MAX_STRINGS];
    

    Además, la función ReadStrings llama a gets, que es una función peligrosa dado que puede provocar desbordamientos de búfer. Se recomienda en su lugar utilizar fgets, que limita la cantidad de entrada que puede ser leída.

    La versión revisada de ReadStrings se vería así:

    int ReadStrings(char **ArrayStr) {
        int string_pos = 0;
        char input[MAX_CHARS_STRING];
    
        while (string_pos < MAX_STRINGS) {
            if (fgets(input, MAX_CHARS_STRING, stdin) == NULL) {
                break; // break loop on error or EOF
            }
            ArrayStr[string_pos] = strdup(input); // allocate memory for string
            string_pos++;
        }
        return 1;
    }
    

    Se observa que se utiliza stdin como flujo de entrada para fgets, y se asigna memoria para cada cadena utilizando strdup. Es importante liberar posteriormente esta memoria asignada.

    Por último, la función WriteStrings que se llama en main no se proporciona, por lo que no se entiende lo que hace. Si se supone que debe imprimir las cadenas en el arreglo, se vería algo así:

    int WriteStrings(char **ArrayStr) {
        int string_pos = 0;
    
        while (string_pos < MAX_STRINGS) {
            if (ArrayStr[string_pos] == NULL) {
                break;
            }
            printf("%s\n", ArrayStr[string_pos]);
            free(ArrayStr[string_pos]); // free memory allocated in ReadStrings
            string_pos++;
        }
        return 1;
    }
    

    En general, el código revisado se vería así:

    “`C
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    const int MAX_CHARS_STRING = 20;
    const int MAX_STRINGS = 5;

    int ReadStrings(char **ArrayStr) {
    int string_pos = 0;
    char input[MAX_CHARS_STRING];

    while (string_pos < MAX_STRINGS) {
        if (fgets(input, MAX_CHARS_STRING, stdin) == NULL) {
            break; // break loop on error or EOF
        }
        ArrayStr[string_pos] = strdup(input); // allocate memory for string
        string_pos++;
    }
    return 1;
    

    }

    int WriteStrings(char **ArrayStr) {
    int string_pos = 0;

    while (string_pos < MAX_STRINGS) {
        if (ArrayStr[string_pos] == NULL) {
            break;
        }
        printf("%s\n", ArrayStr[string_pos]);
        free(ArrayStr[string_pos]); // free memory allocated in ReadStrings
        string_pos++;
    }
    return 1;
    

    }

    int main() {
    int err = 0;
    char *ArrayStrings[MAX_STRINGS];
    err = ReadStrings(ArrayStrings);
    err = WriteStrings(ArrayStrings);
    return 0;
    }
    “`</string.h></stdlib.h></stdio.h>

Comments are closed.