Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Error 404: en 22 Mayo 2013, 13:20 pm



Título: Error en programa de punteros
Publicado por: Error 404: en 22 Mayo 2013, 13:20 pm
Hola a todos ( de nuevo ), siento tener que preguntar demasiadas cosas pero espero que tengan paciencia con este novato  :-[
El problema es el siguiente, tengo que hacer el siguiente ejercicio para el manual que me estoy leyendo:

Escribir un programa con una funcion que calcule la longitud de una cadena de caracteres. El nombre de la funcion sera LongitudCadena, debe devolver un "int", y como parametros de entrada debe tener un puntero a "char". (En "main" probar con distintos tipos de cadenas:arrays y punteros. )<--- Esto no lo pillo xd.

 Ahora mismo llevo esto pero no me sale, agradeceria ayuda porque la verdad lo de los punteros me esta resultando bastante dificil   :-(

No estoy pidiendo que me manden el codigo del programa entero!!! (que sino no aprendo xd), sino que me digan mi error y si es posible un ejemplo de bien usado, pero en un miniejemplo no el programa.

Muchas gracias por adelantado ;)
PD: EN EL CODIGO DONDE PONE &#241; ES UNA --->Ñ<--- QUE EL C++ NO ME LEE XD
Código
  1.  
  2. #include <iostream>
  3. using namespace std;
  4. bool LongitudCadena(char* cadena);
  5. int main() {
  6.    char cadena[100];
  7.    char resp[4];
  8.     char c;
  9.     cadena=c;
  10.    do{
  11.         cout << endl << endl;
  12.         cout << "Introduce la cadena de la que desees saber su tamaño:" << endl<< endl;
  13.         cin >> cadena ;cout << endl << endl; cin.get();
  14.         cout << "Tamaño de la cadena: "  << c <<endl<<endl;
  15.         system("PAUSE");
  16.         cout << "Desea reiniciar a otra cadena: "; cin >> resp;cin.get();
  17.  
  18.    }
  19.      while(resp[0]==('s'|| 'S' || 'y' || 'Y'));
  20.  
  21.    cin.get();
  22.    return 0;
  23. }
  24. bool LongitudCadena(char* n){
  25.     for (i=0;i<100;i++)
  26.     do (sizeof(cadena[i])); while( cin.get());
  27.     }
  28.  

Algo me tiene que fallar en el puntero, no se si es la declaracion o que exactamente pero algo me falla...  :huh:
Gracias de nuevo ;)


Título: Re: Error en programa de punteros
Publicado por: amchacon en 22 Mayo 2013, 13:31 pm
Buen post, te ha faltado decir que error te da  :silbar:

De momento veo algunos fallos:

Código
  1. char cadena[100];
  2. char resp[4];
  3. char c;
  4. cadena=c;

¿Que pretendías hacer en la última línea? Estas asignando un puntero a una variable que ni siquiera has inicializado... Los efectos son impresivibles, borrala.

Código
  1. cout << "Tamaño de la cadena: "  << c <<endl<<endl;
c no es la función sino la variable que has declarado antes. Ahí deberías poner LongitudCadena(cadena)

Código
  1. bool LongitudCadena(char* n){
  2.    for (i=0;i<100;i++)
  3.    do (sizeof(cadena[i])); while( cin.get());
  4.    }

Una funcion que obtiene la longitud de la cadena pero devuelve un bool? (bueno en teoría devuelve bool pero no has puesto ningún return). ¿Y a santo de que va el cin.get()? Además la cadena las has llamado ahí n.

El ultimo byte de una cadena se simboliza con un caracter nulo '\0'. Para calcular el tamaño de una cadena tienes que ir comprobando hasta llegar al caracter nulo:

Código
  1. int LongitudCadena(char* n){
  2.   int Tamanyo = 0;
  3.  
  4.   while (n[tamanyo] != '\0')
  5.   {
  6.    Tamanyo++;
  7.   }
  8.  
  9.   return Tamanyo; // Devolver el tamanyo
  10. }
     


Título: Re: Error en programa de punteros
Publicado por: Error 404: en 22 Mayo 2013, 14:12 pm
Vale he efectuado los cambios y este es el resultado:
Código
  1. #include <iostream>
  2. using namespace std;
  3. int LongitudCadena(char* cadena){
  4.    int tamanyo = 0;
  5.  
  6.    while (cadena[tamanyo] != '\0')
  7.    {
  8.          tamanyo++;
  9.    }
  10.    return tamanyo;
  11. }
  12.  
  13.  
  14. int main() {
  15.    char cadena[100];
  16.    char resp[4];
  17.     char c;
  18.    Bucle:
  19.  
  20.         cout << endl << endl;
  21.         cout << "Introduce la cadena de la que desees saber su tamanyo:" << endl<< endl;
  22.         cin >> cadena ;cout << endl << endl; cin.get();
  23.         cout << "Tamanyo de la cadena: "  << LongitudCadena(cadena) <<endl<<endl;cin.get();
  24.         cout << "Desea hacer a otra cadena: "; cin >> resp ;cin.get();
  25.  
  26.  
  27.      if(resp[0]=='s'||resp[0]== 'S' ||resp[0]== 'y' ||resp[0]== 'Y') goto Bucle; cin.get();
  28.  
  29.    cin.get();
  30.    return 0;
  31. }
  32.  

Pero lo malo es que si introduzco mas de una palabra solo me dice el tamaño de la primera y no del conjunto; supongo que por esta parte :
Código
  1. while (cadena[tamanyo] != '\0')
Ya que en cuanto hay un conjunto vacio deja de leer, ¿cómo podria hacer que lea mas palabras sin que cuente los espacios, es decir podria por ejemplo hacer que si lee dos conjuntos vacios (en vez de uno) deje de leer? Y de ser asi, como lo conseguiria???
Muchas gracias por tu ayuda amchacon me ha servido  :D
PD: YA SE QUE NO ES RECOMENDABLE USAR GOTO, PERO AL SER UN PROGRAMA FACIL NO CREO QUE DE PROBLEMAS AL COMPILADOR XD


Título: Re: Error en programa de punteros
Publicado por: amchacon en 22 Mayo 2013, 14:51 pm
No, el caracter nulo '\0' no es lo mismo que los espacios ' '

El problema es del cin que corta cuando pilla un espacio. Si quieres coger una linea entera:

Código
  1. cin.getline(cadena,100);


Título: Re: Error en programa de punteros
Publicado por: leosansan en 22 Mayo 2013, 16:10 pm
Vale he efectuado los cambios y este es el resultado:
Citar
................................................................................   
      if(resp[0]=='s'||resp[0]== 'S' ||resp[0]== 'y' ||resp[0]== 'Y') goto Bucle; cin.get();
    
    cin.get();
    return 0;
}
................................................................
 YA SE QUE NO ES RECOMENDABLE USAR GOTO, PERO AL SER UN PROGRAMA FACIL NO CREO QUE DE PROBLEMAS AL COMPILADOR XD

¿Y por qué no lo dejas con el do while que tenías originalmente y que tan bien funcionaba?. Ahora, por ejemplo,  tienes un "cin.get();" después de bucle que nunca se va a ejecutar ¡ ¡ ¡ ¡ ¡ y eso que el programa es cortito.

Te dejo otra opción para la función Longitud, como simple práctica/ curiosidad:

Código
  1. int LongitudCadena(char* n){
  2.    int i;
  3.    for ( i=0;n[i] != '\0';i++);
  4.    return i; // Devolver el tamanyo
  5. }

Saluditos!. .... ..(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Error en programa de punteros
Publicado por: Error 404: en 22 Mayo 2013, 19:56 pm
Vale he metido lo de cin.getline(cadena,100) pero ahora me da un numero mas raro y sin sentido ( en el tamaño), por ejemplo si pongo como cadena "hola amigo" me devuelve 6 de tamaño... :huh: me tiene perplejo no se...
Aqui va el codigo como lo tengo actualmente por si es que lo he metido mal o algo.
PD: GRACIAS POR SU PACIENCIA Y SU AYUDA  :rolleyes:

Código
  1. #include <iostream>
  2. using namespace std;
  3. int LongitudCadena(char* cadena){
  4.    int tamanyo = 0;
  5.  
  6.    while (cadena[tamanyo] != '\0')
  7.    {
  8.          tamanyo++;
  9.    }
  10.    return tamanyo;
  11. }
  12.  
  13.  
  14. int main() {
  15.    char cadena[100];
  16.    char resp[4];
  17.     char c;
  18.    do{
  19.  
  20.         cout << endl << endl;
  21.         cout << "Introduce la cadena de la que desees saber su tamanyo:" << endl<< endl;
  22.         cin >> cadena ;cout << endl << endl; cin.getline(cadena,100);
  23.         cout << "Tamanyo de la cadena: "  << LongitudCadena(cadena) <<endl<<endl;cin.get();
  24.         cout << "Desea hacer a otra cadena: "; cin >> resp ;cin.get();
  25.         }
  26.  
  27.      while(resp[0]=='s'||resp[0]== 'S' ||resp[0]== 'y' ||resp[0]== 'Y') ;
  28.  
  29.    cin.get();
  30.    return 0;
  31. }


Título: Re: Error en programa de punteros
Publicado por: amchacon en 24 Mayo 2013, 10:42 am
No has quitado el antiguo cin  :silbar:


Título: Re: Error en programa de punteros
Publicado por: leosansan en 24 Mayo 2013, 11:24 am
Vale he metido lo de cin.getline(cadena,100) pero ahora me da un numero mas raro y sin sentido ( en el tamaño), por ejemplo si pongo como cadena "hola amigo" me devuelve 6 de tamaño... :huh: me tiene perplejo no se...


¿Y qué querías que te devolviera?. Si lo observas con atención el primer cin "pilla" todos los caracteres "hasta" que encuentra un espacio en blanco, es decir la palabra" hola". Lo demás que queda en el buffer "_amigo" son seis caracteres que cin.get "vuelve" a meter como variable cadena y ese es el resultado que devuelve la función que calcula la longitud. Así de sencilla es la explicación de ese número que te tenía perplejo.

Saluditos! ....


(http://i1280.photobucket.com/albums/a497/leosansan/leosan1/leones%20peques/lion14peque_zps1d213b80.jpg)