[C con Clase] Duda: argv a char[]

Steven Davidson srd4121 en njit.edu
Mie Feb 15 21:25:06 CET 2012


Hola Sergio,

2012/2/15 Sergio Torró <storro.zgz en gmail.com>:
> Gracias por tu rauda respuesta, Steven :-) Comprendo lo que dices y he
> solucionado el problema (me temo que debo volver a leer la lección!), el
> ejercicio 5 ya me funciona bien al completo, pongo lo que he hecho por si le
> sirve a alguien:
>
>        int tot;
>        for (tot = 0; argv[1][tot] != '\0'; tot++); //Calculo el total de caracteres que contiene argv, almacenandolo en "tot"
>
>        for (int i = 0; i <= tot; i++)
>        {
>            if (i == tot) //Si se cumple es que he llegado al final y debo meter el caracter nulo

No aconsejo escribir código así. No tiene sentido comprobar algo que
sabemos de antemano que va a ser falso las primera 'tot' veces y
verdadera la última.

Para este caso, realizamos la asignación para la última iteración del
bucle 'for'. Esto significa que "sacamos" la última iteración fuera
del bucle. Así nos evitamos hacer comprobaciones innecesarias.

Además, esto refleja mejor el diseño:

1. Copia cada carácter de 'argv[1]' a 'p'  =>  bucle
2. Agrega el carácter nulo al final

Por otro lado, podríamos haber hecho un 'do/while' para copiar todos
los caracteres, incluido el nulo al final. Por ejemplo,

do
  p[i] = argv[1][i];
while( p[i] );

Así se copia el carácter nulo, y luego se comprueba si es el carácter
nulo, para salir del bucle.

>            {
>                p[i] = 0;
>            }
>            else
>
>            {
>                p[i] = argv[1][i];
>            }
>        }
>        cout << "p = " << p << endl; //Ahora ya muestra lo que tiene que mostrar :-)
>
> En cuanto al ejercicio 4 tienes toda la razón, ya sabía yo que utilizar
> funciones estándares era hacer trampa... Voy a releer la lección a ver si

Además, si cambiáremos el tamaño de la cadena-número de 9
caracteres-dígitos a 20, por ejemplo, no hay ninguna función estándar
que pueda ayudarte, porque no existe un tipo de dato fundamental que
ahora mismo represente un entero de más de 64 bits.

> logro terminarlo como es debido. Por cierto, ¿si los envío al correo que
> pone en la lección los corregís, es así?
>

Sí, por favor. Esto es para que los que estén haciendo los ejercicios
no se sientan "intimidados" al ver otros códigos fuente ni tampoco
"tentados" a copiarse.


Espero que lo anterior te ayude.

Steven




Más información sobre la lista de distribución Cconclase