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.

Argv no funciona con puntero de char en la terminal

Quiero escribir un programa que cuando esté en la terminal y escriba prog.exe -u palabra transformará palabra a mayúsculas, de lo contrario omitirá el proceso. Pero cuando compilo el código que se muestra abajo, no obtengo nada en la pantalla y no pude descubrir por qué ocurre el error.

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

char u[] = "-u";

void upper(const char *src, char *dest);

int main(int argc, char const *argv[]) {
if (argc < 3) {
printf("¡Introduzca al menos 3 argumentos!\n");
} else
if (!(strcmp(argv[1], u))) {
char *output;
upper(argv[2], output);
printf("%s\n", output);
} else {
printf("No hay opción\n");
}
return 0;
}

void upper(const char <em>src, char *dest) {
while (</em>src) {
if (*src >= 97 && *src <= 122) {
*dest = *src – 32;
} else {
*dest = *src;
}
src++;
dest++;
}
*dest = *src;
}
“`</time.h></stdlib.h></stdio.h></string.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El código anterior está faltando una asignación para la variable output utilizada en la función main. Esto significa que la función upper está escribiendo la versión en mayúsculas de la cadena argv[2] en una ubicación indefinida, lo que puede causar un comportamiento indefinido.

    Para solucionar esto, asigna memoria para la variable output utilizando malloc antes de llamar a la función upper. Además, la función upper debe agregar un terminador nulo al final de la cadena dest después de escribir en ella, ya que está ausente en la implementación actual.

    Aquí está el código corregido:

    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    char u[] = "-u";
    
    void upper(const char *src, char *dest);
    
    int main(int argc, char const *argv[]) {
        if (argc < 3) {
            printf("Ingrese al menos 3 argumentos.\n");
        } else if (!(strcmp(argv[1], u))) {
            char *output = malloc(strlen(argv[2]) + 1); // asignar memoria para output
            upper(argv[2], output);
            printf("%s\n", output);
            free(output); // liberar la memoria asignada
        } else {
            printf("Sin opción.\n");
        }
        return 0;
    }
    
    void upper(const char *src, char *dest) {
        while (*src) {
            if (*src >= 97 && *src <= 122) {
                *dest = *src - 32;
            } else {
                *dest = *src;
            }
            src++;
            dest++;
        }
        *dest = '\0'; // agregar terminador nulo a la cadena dest
    }
    

    Esto debería imprimir correctamente la versión en mayúsculas del argumento word pasado con la opción -u, de lo contrario simplemente lo omitirá.</time.h></stdlib.h></stdio.h></string.h>

Comments are closed.