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>
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ámetroArrayStr
, que es un puntero a un arreglo de punteros de caracteres. Sin embargo, en la funciónmain
, se declara en su lugar un arreglo de arreglos. Esto significa que la funciónReadStrings
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í:Además, la función
ReadStrings
llama agets
, que es una función peligrosa dado que puede provocar desbordamientos de búfer. Se recomienda en su lugar utilizarfgets
, que limita la cantidad de entrada que puede ser leída.La versión revisada de
ReadStrings
se vería así:Se observa que se utiliza
stdin
como flujo de entrada parafgets
, y se asigna memoria para cada cadena utilizandostrdup
. Es importante liberar posteriormente esta memoria asignada.Por último, la función
WriteStrings
que se llama enmain
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í: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];
}
int WriteStrings(char **ArrayStr) {
int string_pos = 0;
}
int main() {
int err = 0;
char *ArrayStrings[MAX_STRINGS];
err = ReadStrings(ArrayStrings);
err = WriteStrings(ArrayStrings);
return 0;
}
“`</string.h></stdlib.h></stdio.h>