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

Steven Davidson srd4121 en njit.edu
Mie Feb 15 19:16:22 CET 2012


Hola Sergio,

2012/2/15 Sergio Torró <storro.zgz en gmail.com>:
> Muy buenas a todos. Es el primer correo que escribo a esta lista, así que

Ante todo, bienvenido a la lista de correo-e y a este "mundillo" de la
programación en C++.

> antes de nada me presento: soy un joven estudiante de programación (FP) que
> hace poco decidió dedicar parte de su tiempo libre a seguir el magnifico
> curso “C++ con Clase” :-) Oficialmente estudio Java, pero me interesa

Muchas gracias. Nos alegra saber que el curso te sea de ayuda.

> también aprender C++ y tengo alguna noción de C de cosas que he ido haciendo
> por mi cuenta. Ahora mismo estoy terminando los problemas del capítulo 10 y
> mi duda es la siguiente:
>
> El problema surge en el ejercicio 5 al asignar el parámetro pasado al main a
> un char[]. El caso es que ademas de meter el valor que le paso, mete después
> de este “basura” y no se porque lo hace exactamente, ni como puedo
> controlarlo. En el ejercicio 4 no he tenido muchos problemas ya que casteo
> el char a int para incrementarlo (no se si es correcta esa resolución, pero
> funciona, aunque también mete “basura” en el char ;-P pero el casteo la
> ignora¿).
>

Si conviertes un 'char' a 'int', no hay problemas, pero ten presente
lo que significa tal "conversión", ya que es de tipo, no
necesariamente de información. O mejor dicho, no se "traduce" o se
"interpreta" un carácter que represente un dígito a un número entero
de tal dígito. Por ejemplo,

char c = '5';

int num = (int) c;

cout << num;

No aparecerá en pantalla:

5

Sino que será,

53

ya que '5' realmente es 53: su código ASCII (
http://c.conclase.net/curso/index.php?cap=900#inicio ).

Para convertir la información de '5' á 5, tendrás que hacerla tú
misma. Ciertamente, existen algunas funciones estándares, pero el
ejercicio #4 no trata de demostrar lo bien que sabes usar las
funciones estándares, sino lo bien que sabes los temas tratados hasta
el momento; principalmente, cadenas de caracteres.

> Pongo el código de lo que intento explicar:
>

Veamos el código.

> int main(int argc, char *argv[])
> {
> char p[40];
>
> if (argc < 2)
> {
> cout << "Introduce una palabra (max. 40 chars): ";
> cin >> p;
> }
> else
> {
> for (int i = 0; argv[1][i] != '\0'; i++)
> {
> p[i] = argv[1][i];
> }

Esto es correcto, pero al terminar el bucle, tienes que agregar el
carácter nulo al final de la cadena en 'p'. Esto es,

p[i] = 0;

Esto significa que tendrás que definir 'i' en otro ámbito anterior (o
más grande) que el del bucle 'for', porque necesitamos el valor final
de esa variable 'i'.

> cout << "p = " << p << endl;
> }
> ......
> ......
> }
>
> El resultado de “p” es el valor que le paso más un montón de símbolos y
> números. ¿Es correcto como lo estoy haciendo? ¿De donde sale todos esos
> símbolos?
>

Bueno, ya te lo he explicado anteriormente. Los caracteres raros es
porque 'cout <<' continúa hasta toparse con el primer carácter nulo,
que puede ser el siguiente carácter, si tienes suerte, o dentro de
2000 y pico caracteres. Lo malo es cuando invada la memoria de otra
variable, programa, o lo que haya después, que posiblemente el sistema
operativo te lance un error en tiempo de ejecución al estilo de
"Violación de Segmento: Acceso denegado (lectura)".

> El programa me funciona correctamente si no uso los parámetros del main,
> pero soy un poco cabezón y me he emperrado en hacerlo funcionar!
>
> Un saludo y gracias :-)
>
> PD: Se acerca mi cumpleaños y estoy pensando en regalarme a mi mismo un buen
> libro de C++. He visto que hablan muy bien de los libros de Deitel, ¿me
> podríais recomendar alguno bueno?
>

Para comenzar, los libros de Deitel & Deitel me parecen muy bien. Si
de verdad te quieres meter de lleno en C++, recomiendo el libro de
Bjarne Stroustrup (creador de C++): "El Lenguaje de Programación de
C++".

Ahora bien, yo que tú me esperaría un poco, porque acaban de aprobar
la nueva versión de C++ que tiene muchas características nuevas.


Espero que esto te aclare la duda.

Steven




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