string & parametro dudas !!

Iniciado por bash, 18 Mayo 2015, 14:42 PM

0 Miembros y 1 Visitante están viendo este tema.

bash

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 (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;

void reverse(const char *rev)
{
    int len = strlen(rev) + 5 ;
char *reverse = new char[len];
for(int i=0 ; len > 0 ; len--,i++){
   reverse[i] = rev[len];
       cout <<rev[len];
  }
  cout <<endl;
  delete reverse;
}



int main(int argc, char *argv[])
{
const char *szstring = "linda";
reverse(szstring);
system("pause");
return 0;
}
gracias por responder mis dudas

ivancea96

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.

bash

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 !!
gracias por responder mis dudas

Peregring-lk

#3
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 (cpp) [Seleccionar]

void reverse(char const* str)
{
  // Bucle en dirección inversa.
  for (size_t i = strlen(str) - 1; i >= 0; --i)
     cout << str[i];

  cout << endl;
}

int main()
{
  reverse("linda");

  system("pause");

  return 0;
}


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 (cpp) [Seleccionar]

void reverse(char const* str)
{
  size_t i = strlen(str);

  while (i --> 0)
     cout << str[i];

  cout << endl;
}


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 (cpp) [Seleccionar]

// La cadena devuelta por `reverse` es dinámica, y el usuario de la función es responsable de
// eliminarla.
char* reverse(char const* str)
{
  size_t len = strlen(str);
  char* rev = new char[len + 1]; // 1 extra para el '\0'.

  for (size_t i = 0; i < len; ++i)
     rev[i] = str[len - i - 1];

  rev[len] = '\0';

  return rev;
}

int main()
{
  char const* rev = reverse("linda");

  cout << rev << endl;

  delete[] rev;

  system("pause");

  return 0;
}