elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Calcular longitud de cadena C++ (punteros)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Calcular longitud de cadena C++ (punteros)  (Leído 19,926 veces)
Bob1098

Desconectado Desconectado

Mensajes: 87


Ver Perfil
Calcular longitud de cadena C++ (punteros)
« en: 15 Septiembre 2014, 16:51 pm »

Hola a todos, estoy intentando resolver un ejercicio de c++ que dice lo siguiente:

"Escribir un programa con una función que calcule la longitud de una cadena de caracteres. El nombre de la función será LongitudCadena, debe devolver un int, y como parámetro de entrada debe tener un puntero a char.
 En esta función no se pueden usar enteros para recorrer el array, usar sólo punteros y aplicar aritmética de punteros.
 En main probar con distintos tipos de cadenas: arrays y punteros."

Supongo que no vale esto de recorrer el array con un entero y luego devolver dicho entero, por tanto he probado con esto:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int LongitudCadena(char*);
  6.  
  7. int main() {
  8. char cadena[10];
  9. char *pCadena = 0;
  10.  
  11. cout << "Introduce una cadena como array: ";
  12. cin >> cadena;
  13. cout << "Su tamano es: " << LongitudCadena(cadena) << ". " << endl;
  14. cout << "\nIntroduce una cadena como puntero: ";
  15. cin >> *pCadena;
  16. cout << "Su tamano es: " << LongitudCadena(pCadena) << ". " << endl;
  17.  
  18. cin.sync();
  19. cin.get();
  20. return 0;
  21. }
  22.  
  23. int LongitudCadena(char *a) {
  24. char *p, *q;
  25. p = a;
  26. q = a;
  27. while (*a) q++;
  28. return q-p;
  29. }

Seguro que hay una forma mucho mas simple, pero aun soy nuevo con esto de los punteros y no los comprendo muy bien. Espero que se pueda encontrar el fallo.

Un saludo.


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Calcular longitud de cadena C++ (punteros)
« Respuesta #1 en: 15 Septiembre 2014, 17:00 pm »

Dado que la 'a' no cambia, "while(*a)" dará bucle infinito.

Puedes poner, en su lugar: "while(*q) ++q;".

Además, si quieres usarlo para otros tipos, deberías poner: "return (q-p)/sizeof(char);". Claro que en este caso, al ser char, no tiene mucho sentido jaja

En todo caso yo quitaría la variable 'p', que sobra. En vez de "return q-p;", poner "return q-a;".


En línea

Danyfirex


Desconectado Desconectado

Mensajes: 493


My Dear Mizuho


Ver Perfil
Re: Calcular longitud de cadena C++ (punteros)
« Respuesta #2 en: 15 Septiembre 2014, 18:51 pm »

Podría ser algo así.


Código
  1. unsigned int Largo(char * ptr){
  2. unsigned int len=0;
  3.  
  4. while (*ptr++)len++;
  5. return len;
  6. }
  7.  

Saludos
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Calcular longitud de cadena C++ (punteros)
« Respuesta #3 en: 15 Septiembre 2014, 19:09 pm »

Podría ser algo así.


Código
  1. unsigned int Largo(char * ptr){
  2. unsigned int len=0;
  3.  
  4. while (*ptr++)len++;
  5. return len;
  6. }
  7.  

Saludos

¿Y la aritmética de punteros donde queda?

Tratando el tema dejado por ivancea96, tal y como está planteado el enunciado no tiene ningún sentido hacer un código más genérico por varias razones:

* Únicamente las cadenas de caracteres tienen la obligación de terminar con caracter nulo.
* La función no admite un segundo parámetro que permita identificar el final de la cadena.

Si se dispusiese de información adicional y de algo más de flexibilidad sería fácil hacer una función genérica que calculase el tamaño de un array cualquiera.

En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Calcular longitud de cadena C++ (punteros)
« Respuesta #4 en: 15 Septiembre 2014, 19:21 pm »

Hablaba para poder portarlo a widechar, por ejemplo. Pero era una mera curiosidad, no digoque sea necesario xD
En línea

Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Calcular longitud de cadena C++ (punteros)
« Respuesta #5 en: 15 Septiembre 2014, 20:08 pm »

Seguro que hay una forma mucho mas simple, pero aun soy nuevo con esto de los punteros y no los comprendo muy bien.

Quedaría mas o menos así :

Código
  1. size_t LongitudCadena(const char *str)
  2. {
  3.    const char *s;
  4.    for (s = str; *s; ++s);
  5.    return(s - str);
  6. }

No hay necesidad de usar un segundo puntero

Un Saludo

En línea

Bob1098

Desconectado Desconectado

Mensajes: 87


Ver Perfil
Re: Calcular longitud de cadena C++ (punteros)
« Respuesta #6 en: 16 Septiembre 2014, 15:32 pm »

Vale, muchas gracias a todos por las respuestas. Aunque estoy sea una cosa muy simple me sirve para intentar comprender el funcionamiento de los punteros, ya que según he leído por ahí los punteros usados correctamente son una herramienta muy poderosa.

Un saludo y gracias.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Calcular longitud de cadena C++ (punteros)
« Respuesta #7 en: 16 Septiembre 2014, 17:15 pm »

Otra parte que se debe corregir para que el programa funcione correctamente es:
Código
  1. int main()
  2. {
  3.   char cadena[10];
  4.   char *pCadena = 0;
  5.  
  6.   cout << "Introduce una cadena como array: ";
  7.   cin >> cadena;
  8.   cout << "Su tamano es: " << LongitudCadena(cadena) << ". " << endl;
  9.   cout << "\nIntroduce una cadena como puntero: ";
  10.   cin >> *pCadena;
  11.   cout << "Su tamano es: " << LongitudCadena(pCadena) << ". " << endl;

Ahí el valor inicial de "pCadena" no es valido, hay que cambiarlo a:
Código
  1. int main()
  2. {
  3.   char cadena[10];
  4.   char *pCadena = cadena;
  5.  
  6.   cout << "Introduce una cadena como array: ";
  7.   cin >> cadena;
  8.   cout << "Su tamano es: " << LongitudCadena(cadena) << ". " << endl;
  9.   cout << "\nIntroduce una cadena como puntero: ";
  10.   cin >> pCadena;
  11.   cout << "Su tamano es: " << LongitudCadena(pCadena) << ". " << endl;

Sin embargo no es un buen ejercicio para la practica de punteros por lo siguiente:
1) Cuando se utiliza el operador ">>" con el objeto "cin" (como en tu ejemplo) se lee una palabra y se debe indicar mediante un puntero donde debe almacenarse.
2) Ese puntero se genera de forma automática al utilizar el identificador del array (este es "cadena").

En pocas palabras no hay tal diferencia entre array y puntero en este caso, supongo lo que quiere enseñar el profesor es el uso de los operadores "[]" y "*".

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Bob1098

Desconectado Desconectado

Mensajes: 87


Ver Perfil
Re: Calcular longitud de cadena C++ (punteros)
« Respuesta #8 en: 17 Septiembre 2014, 18:22 pm »

Otra parte que se debe corregir para que el programa funcione correctamente es:
Código
  1. int main()
  2. {
  3.   char cadena[10];
  4.   char *pCadena = 0;
  5.  
  6.   cout << "Introduce una cadena como array: ";
  7.   cin >> cadena;
  8.   cout << "Su tamano es: " << LongitudCadena(cadena) << ". " << endl;
  9.   cout << "\nIntroduce una cadena como puntero: ";
  10.   cin >> *pCadena;
  11.   cout << "Su tamano es: " << LongitudCadena(pCadena) << ". " << endl;

Ahí el valor inicial de "pCadena" no es valido, hay que cambiarlo a:
Código
  1. int main()
  2. {
  3.   char cadena[10];
  4.   char *pCadena = cadena;
  5.  
  6.   cout << "Introduce una cadena como array: ";
  7.   cin >> cadena;
  8.   cout << "Su tamano es: " << LongitudCadena(cadena) << ". " << endl;
  9.   cout << "\nIntroduce una cadena como puntero: ";
  10.   cin >> pCadena;
  11.   cout << "Su tamano es: " << LongitudCadena(pCadena) << ". " << endl;

Sin embargo no es un buen ejercicio para la practica de punteros por lo siguiente:
1) Cuando se utiliza el operador ">>" con el objeto "cin" (como en tu ejemplo) se lee una palabra y se debe indicar mediante un puntero donde debe almacenarse.
2) Ese puntero se genera de forma automática al utilizar el identificador del array (este es "cadena").

En pocas palabras no hay tal diferencia entre array y puntero en este caso, supongo lo que quiere enseñar el profesor es el uso de los operadores "[]" y "*".

Un saludo

Vale, ya lo voy pillando. Gracias por la respuesta.

Un saludo
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Calcular longitud de cadena C++ (punteros)
« Respuesta #9 en: 17 Septiembre 2014, 20:54 pm »

¡Buenas!

Esta función es muy sencilla también:
Código
  1. int longitud(char *s)
  2. {
  3.    if(!(*s))
  4.        return 0;
  5.  
  6.    return 1 + longitud(s + 1);
  7. }
  8.  

¡Saludos!

PD: o con un cuerpo de una sola línea: XD
Código
  1. int longitud(char *s)
  2. {
  3.    return (*s) ? 1 + longitud(s + 1) : 0;
  4. }
  5.  
« Última modificación: 17 Septiembre 2014, 20:56 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[batch] Funcion :len (devuelve la longitud de una cadena)
Scripting
The Shadow 0 2,546 Último mensaje 18 Febrero 2008, 21:32 pm
por The Shadow
Longitud de una cadena en mssql_fetch_object
PHP
Belem 1 2,470 Último mensaje 19 Abril 2010, 16:42 pm
por MazarD
Calcular kilometros en latitud y longitud xD
Foro Libre
Kase 3 4,662 Último mensaje 3 Agosto 2011, 23:42 pm
por raul338
obtener longitud de una cadena sin LEN « 1 2 »
Programación Visual Basic
x64core 11 8,236 Último mensaje 10 Septiembre 2011, 02:24 am
por Psyke1
[C] ¿Por que una cadena acepta mas valores que su longitud? (solucionado)
Programación C/C++
xiruko 8 4,180 Último mensaje 19 Abril 2012, 06:06 am
por david_BS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines