Quiero leer un conjunto de cadenas de caracteres en una matriz. El tamaño de la matriz, se decide en tiempo de ejecución utilizando malloc o alloc es decir, el número de cadenas que se aceptan como entrada. He probado el siguiente código pero no funcionó.

char *array;
array=(char*)malloc(sizeof(char)*t); //t is the size of array
for(int temp=0;temp<t;temp++)
{
    gets(a[temp]);
}

La misma trabajado en el caso de la matriz de números enteros.

Por favor me ayude en la búsqueda de la solución.

  • Por CIERTO, sizeof(char) es redundante; está definido y que es requerido por el estándar de C a 1.
  • a la derecha, sizeof(char) es redundante. En lugar de eso debería usar malloc(1*t).
  • ¿por qué no malloc(t)? 🙂
InformationsquelleAutor Jainendra | 2012-05-08

4 Comentarios

  1. 5

    C no tiene ningún automático incorporado en un soporte para almacenar cadenas de caracteres, no hay una variable que es «una cadena», y automáticamente se puede crecer para mantener el número correcto de caracteres. Necesita asignar la memoria.

    Lo que estamos haciendo ahora, es la asignación de lugar para el correcto número de punteros a caracteres, pero no para todos los personajes. Así que el gets() llamada está escrito en la memoria que no está asignado, el cual es un comportamiento indefinido. Desde los enteros ajuste completamente en una sola asignación de cada uno, es por eso que un código similar trabajado para los números enteros. Las cadenas son más complejos, por lo que usted necesita hacer más trabajo.

    Si no se conoce ningún límite superior en la longitud de estas cadenas, se puede utilizar un buffer temporal de longitud fija, y a continuación copiar desde que en nueva asignación dinámica de memoria una vez que usted sabe el tamaño requerido. Si no hay tal enlazado, es necesario repetir el mismo concepto, mediante la lectura de un bloque fijo, almacenar, y si no al final de la línea se encuentra, leer otro bloque, hacer crecer la asignación de memoria para la cadena utilizando realloc(), anexar los nuevos personajes, y repetir hasta el fin de línea.

    Como una nota de lado, siempre se debe evitar el uso de gets(), ya que no es compatible con la protección de su programa contra desbordamiento de búfer. Es mucho mejor usar fgets(), documentadas en la misma página.

  2. 1

    Lo que asignar espacio para exactamente una cadena almacenada en cero terminada en formato.

    Si desea almacenar una matriz de varias cadenas, usted necesita para malloc() una matriz de char * ADEMÁS de las varias cadenas de caracteres.

    Además, gets() es inseguro, ya que no hay límite de tamaño. En su lugar, utilice fgets(). Se tiene la siguiente firma:

    char *fgets(char *restrict s, int n, FILE *restrict stream);

    Como se quiere a un arroyo, usted sólo debe dar stdin.

    Así que la mejor manera de leer una línea es

    char * read_one_line(uint32_t maxbufsize)
    {
        char * s = malloc(maxbufsize);
        if (!fgets(s, maxbufsize, stdin)) {
            free(s);
            return NULL;
        } else {
            char * s2 = realloc(s, strlen(s)+1); //+1 for the NUL at the end
            if (s2) {
                return s2;
            } else {
                return s; //should never happen as the memory block is shrinked
            }
        }
    }

    Esta función asigna la memoria necesaria para una línea, se redimensiona de forma adecuada después de la lectura y la deja a la persona que llama para liberarlo de nuevo en el momento adecuado.

    • lo que es otra manera eficaz a la lectura de la matriz de cadenas en la entrada?
    • Véase mi edición, donde I denota cómo leer una línea.
  3. 1

    Necesita asignar espacio para un array de cadenas de caracteres (char*) primero:

    char **array;
    array = (char**)malloc(sizeof(char*)*t);

    Entonces usted necesita para asignar espacio para cada uno de ellos (vamos 50 a ser número máximo de caracteres para estas cadenas):

    int i = 0, m = 50;
    for (i = 0; i < t; ++i)
        array[i] = (char*)malloc(sizeof(char)*51); //51 = 50 characters + '
    int i = 0, m = 50;
    for (i = 0; i < t; ++i)
    array[i] = (char*)malloc(sizeof(char)*51); //51 = 50 characters + '\0'
    '

    Y, a continuación, usted puede hacer lo que quería hacer:

    for(i = 0; i < t; ++i)
        scanf("%50s", array[i]);

    Lugar de gets, es mejor usar scanf con especificada ancho (%50s = 50 caracteres + '\0').

  4. 0

    Sólo recuerda que en el pasado en la matriz de caracteres debe ser un NUL carácter.

    para asignar t+1 bytes de memoria con alloc o malloc.

    t bytes para los personajes y de 1 byte para la terminación de NUL carácter.

    después de su for bucle, es decir, fuera del bucle, sólo tiene que escribir

    a[temp] = '
    a[temp] = '\0';
    '
    ;

    entonces usted puede tomar en el trabajo.

    Espero que funcione.

    se parece a este

    char *a = malloc(sizeof((char)*(t+1)));//t is number if characters
    int temp;
    for(temp=0; temp<t; temp++) {
        gets(a[temp]);
    }
    a[temp] = 0;

    a continuación, imprimir la matriz y se obtendrá un string.

    printf("%s",a);
    • a lo que usted desea llamar malloc para cada personaje?!
    • malloc sólo una vez a (t+1) veces
    • ¿Qué hace ‘veces’ significa en su contexto? A qué te refieres bytes?
    • Sí,me refiero a (t+1) bytes…, ‘t’ bytes para el almacenamiento de cadena y de 1 byte para almacenar NULL.
    • 1. Su ejemplo de código sólo lee una cadena (una línea). 2. Utiliza el inherentemente inseguro gets(). No es buena.
    • escribo gets() sólo porque la duda del usuario de utilizar este…

Dejar respuesta

Please enter your comment!
Please enter your name here