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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  string & parametro dudas !!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: string & parametro dudas !!  (Leído 2,125 veces)
bash

Desconectado Desconectado

Mensajes: 258



Ver Perfil
string & parametro dudas !!
« en: 18 Mayo 2015, 14:42 pm »

Buenas a tod@s aqui !!

tengo una duda con el siguiente codigo !!
 vean el codigo !! si se que me paso dandole mas tamanio a len pero por que cuando lo imprimo me sale el pause de system es posible obtener una explicacion. graciass Y disculpen la molestia :)

Código
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <cstring>
  4. using namespace std;
  5.  
  6. void reverse(const char *rev)
  7. {
  8.    int len = strlen(rev) + 5 ;
  9. char *reverse = new char[len];
  10. for(int i=0 ; len > 0 ; len--,i++){
  11.   reverse[i] = rev[len];
  12.       cout <<rev[len];
  13.  }
  14.  cout <<endl;
  15.  delete reverse;
  16. }
  17.  
  18.  
  19.  
  20. int main(int argc, char *argv[])
  21. {
  22. const char *szstring = "linda";
  23. reverse(szstring);
  24. system("pause");
  25. return 0;
  26. }
  27.  


En línea

gracias por responder mis dudas
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: string & parametro dudas !!
« Respuesta #1 en: 18 Mayo 2015, 16:04 pm »

En primer lugar, estás accediendo en la linea 11 a rev[ len ]. Al comienzo, len es igual al tamaño de rev, por lo que ese acceso no es correcto. El for tampoco está correctamente condicionado. No es len>0, es len>=0, pues existe el índice 0. En C y C++ los índices empiezan por 0 (cosa que haces bien con la variable i).
A parte, no deberías trabajar con 2 variables, principalmente porque una va a ser siempre calculable teniendo la otra (y porque no condicionas en ningún momento la variable 'i')

Luego el tema del +5, pues ya no se a qué viene.


En línea

bash

Desconectado Desconectado

Mensajes: 258



Ver Perfil
Re: string & parametro dudas !!
« Respuesta #2 en: 18 Mayo 2015, 18:17 pm »

disculpa tienes razon en todo jeje estoy mal pero lo tire asi , lo del + 5 es la duda y pense que lo habia actualizado es que cuando lo imprimo aparece el pause  de system("pause"). pero me imagino que es que todas los valores de tipo cadena estan en algun sitio juntos en memoria(disculpen mi ignorancia ) bueno me parecio interesante pero no lo entiendo voy a leer  a ver q consigo..gracias !!
En línea

gracias por responder mis dudas
Peregring-lk

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: string & parametro dudas !!
« Respuesta #3 en: 18 Mayo 2015, 22:44 pm »

Siempre ten presente que las funciones deben hacer una sola cosa (o construir una cadena inversa, o imprimirla, pero no ambas). Como tú solamente quieres imprimir, pues que `reverse` imprima, sin más dilación. Si sigues éste principio, tus códigos quedarán siempre mucho más claros. Por otro lado, siempre que trabajes con tamaños e índices, utiliza `size_t`, que no es más que un alias de `unsigned`, pero está pensado precisamente para recorridos y tamaños (`int` y `unsigned` deberían ser usados para problemas más "numéricos" o matemáticos).

Código
  1. void reverse(char const* str)
  2. {
  3.   // Bucle en dirección inversa.
  4.   for (size_t i = strlen(str) - 1; i >= 0; --i)
  5.      cout << str[i];
  6.  
  7.   cout << endl;
  8. }
  9.  
  10. int main()
  11. {
  12.   reverse("linda");
  13.  
  14.   system("pause");
  15.  
  16.   return 0;
  17. }
  18.  

Un truco aprendido por ahí, que simplifica mucho el trabajo, es utilizar "-->", que no es un operador, sino sencillamente, postdecremento y "mayor que", pero se escriben juntos para que parezca una flechita en dirección al 0 (salida del bucle):

Código
  1. void reverse(char const* str)
  2. {
  3.   size_t i = strlen(str);
  4.  
  5.   while (i --> 0)
  6.      cout << str[i];
  7.  
  8.   cout << endl;
  9. }
  10.  

Queda aún más claro, y más legible. Al utilizar un postdecremento de `i`, y suponiéndo que strlen(str) == 5, el `while` va a comparar `i` con los valores 5, 4, 3, 2 y 1 (5 elementos, todos mayores que cero), pero dentro del `while`, debido a que el postdecremento actúa más tarde, los valores serán 4, 3, 2, 1 y 0 (los índices de la cadena), y además, en órden inverso, que es justo lo que quieres.

Si lo que quisieras fuera construir la cadena inversa, e imprimirla fuera, siguiendo el principio de que cada función haga solamente una cosa, pues podría ser así:

Código
  1. // La cadena devuelta por `reverse` es dinámica, y el usuario de la función es responsable de
  2. // eliminarla.
  3. char* reverse(char const* str)
  4. {
  5.   size_t len = strlen(str);
  6.   char* rev = new char[len + 1]; // 1 extra para el '\0'.
  7.  
  8.   for (size_t i = 0; i < len; ++i)
  9.      rev[i] = str[len - i - 1];
  10.  
  11.   rev[len] = '\0';
  12.  
  13.   return rev;
  14. }
  15.  
  16. int main()
  17. {
  18.   char const* rev = reverse("linda");
  19.  
  20.   cout << rev << endl;
  21.  
  22.   delete[] rev;
  23.  
  24.   system("pause");
  25.  
  26.   return 0;
  27. }
  28.  
« Última modificación: 19 Mayo 2015, 16:44 pm por Peregring-lk » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines