[C con Clase] error en argumento, porque?

Steven Davidson srd4121 en njit.edu
Dom Mayo 8 19:34:48 CEST 2011


Hola Goos,

On 5/8/2011 9:41 AM, goosfancito wrote:
> hola, estoy probando esto y me tira error.
>
> -------------------------------
> error:
> warning: format ‘%n’ expects type ‘int*’, but argument 2 has type
> ‘int’
>

Fíjate que se trata de un aviso y no de un error. De todas maneras, sí 
se produciría un error, posiblemente grave. Te comento algunos errores 
más aparte de éste en tu código fuente.

> -------------------------------
>
> #include<stdio.h>
>

Como usas C++, deberías escribir <cstdio> y luego usar el espacio con 
nombre 'std', o simplemente escribir a continuación:

using namespace std;

Si usas un compilador antiguo y obsoleto, como Turbo C++, entonces haz 
caso omiso a lo que te acabo de decir.

> int longitudCadena(char cad[]);
>
> int main(){
> 	 char cadena[5];
> 	 cadena[0] = 'h';
> 	 cadena[1] = 'o';
> 	 cadena[2] = 'l';
> 	 cadena[3] = 'a';
> 	 cadena[4] = 'n';
> 	 cadena[5] = 'd';
> 	 cadena[6] = '0';
> 	

En primer lugar, vas a provocar errores, ya que indicas que 'cadena' es 
de 5 caracteres, pero has asignado 7 elementos. Esto significa que estás 
sobreecribiendo la memoria de los dos bytes contiguos a 'cadena'. indica 
que 'cadena' es de 7 caracteres y no de 5.


Esta última asignación es un error. Te interesa indicar el carácter 
nulo, que es '\0'; o incluso, el valor de 0. Esto es,

cadena[6] = '\0';

o si lo prefieres,

cadena[6] = 0;


Por último, no es necesario asignar explícitamente cada elemento, ya que 
podemos inicializar 'cadena' con la cadena que nos interesa. Esto es,

char cadena[] = "holand";

Como puedes ver, en este caso, no tenemos que indicar explícitamente la 
cantidad de caracteres, ya que el compilador puede deducirla a partir de 
la inicialización.

> 	 printf("%n\n", longitudCadena(cadena));

El error que tienes es que usas el especificador %n para 'printf()', que 
sirve para guardar la cantidad de caracteres escritos (a la pantalla o 
consola, en este caso). Por lo tanto, el tipo del parámetro a 'printf()' 
debe ser un 'int *'.

La solución es que realmente quieres mostrar un número entero (decimal). 
Para esto, elige el especificador %d; esto es,

printf( "%d\n", longitudCadena(cadena) );


Para más información acerca de los especificadores de 'printf()', puedes 
consultar el apéndice C de nuestro curso de C++ en nuestra página yendo 
a: http://c.conclase.net/curso/index.php?cap=902c#lib_printf


Claro está, aconsejamos usar 'cout' que se define en <iostream>. 
Explicamos su uso, al igual que el de 'cin', en el capítulo 6 de nuestro 
curso de C++. Puedes dirigirte a: 
http://c.conclase.net/curso/index.php?cap=006p#resueltos1_6

> 	 return 0;
> }
>
> //------------------
>
> int longitudCadena(char cad[]){
>
>    printf("entro en funcion longitud\n");
>
>    return 0;
> }
>

Por cierto, esto parece que se trata del ejercicio #1 del capítulo 12 de 
nuestro curso de C++. Para los ejercicios, aconsejo que los envíes a: 
ejercicioscpp en conclase.net  Así no habrá influencia entre tus ejercicios 
y los de los demás que están haciéndolos.


Espero haber aclarado las dudas.

Steven





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