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.

¿Cuál es el problema en el código al utilizar un puntero doble para char?

char* scanString()
{
    char* str = NULL;
    char* temp = NULL;
    int  numOfChars = 0;
    char c = '0';
    while (c != '\n')
    {
        scanf("%c", &c);
        str = (char*)realloc(str, sizeof(char) * (numOfChars + 1));
        temp = str;
        if (str == NULL)
        {
            str = temp;
            return str;
        }
        str[numOfChars] = c;
        if (c == '\n')
        {
            str[numOfChars] = '\0';
        }
        numOfChars++;
    }
    return str;
}
int main()
{
    char** doublePointer = NULL;
    char* m = scanString();
    char* token = strtok(m, ",");
    int i = 0;
    while (token != NULL)
    {
        doublePointer = (char**)realloc(doublePointer, sizeof(char*) * (i+1));
        if (doublePointer)
            doublePointer[i] = (char*)realloc(doublePointer[i], strlen(token) + 1);
        strcpy(doublePointer[i], token);
        token = strtok(NULL, ",");
        i++;
    }
    for (int k = 0; k <= i; k++)
    {
        printf("%d: %s\n", k + 1, doublePointer[k]);
    }
    return 0;
}

Estoy intentando obtener una cadena como “opcion1,opcion2,opcion3” y convertirla en un arreglo de cadenas, colocando cada opción en su lugar en el arreglo. Al final, quiero imprimir cada opción en el orden en que se colocaron.
¿Qué estoy haciendo mal?
Gracias por ayudar.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    No parece haber ningún problema importante con el código que pudiera impedir que funcione según lo previsto. Sin embargo, hay algunas cosas pequeñas que podrían mejorarse:

    1. La llamada a la función scanf("%c", &c) es vulnerable a ataques de desbordamiento de búfer. Para mitigar esto, el código debería usar una función de entrada más segura como fgets() en su lugar.
    2. En el bucle for que imprime las opciones, la condición de terminación debería ser k < i en lugar de k <= i para evitar acceder a un elemento fuera de los límites.

    3. Podría ser buena idea agregar alguna verificación de errores para las llamadas a realloc(), en caso de que falle al asignar memoria.

    Aparte de eso, el código debería funcionar correctamente para la tarea dada.

Comments are closed.