Autor Tema: Invertir cadena de caracteres EN C

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

06 Mayo, 2015, 11:35 pm
Leído 1102 veces

Estudiantee

  • Aprendiz
  • Mensajes: 423
  • Karma: +0/-0
  • Sexo: Masculino
Cómo hago para invertir una cadena de caracteres en lenguaje C?? Yo hice este programa pero no me sale:
for(i=strlen(cad);i>=0;i--){
    cad=cad[i-1];
  }

puts(cad);
Dónde está el error?
Si alguien me invita a forocoches, se lo agradecería.

07 Mayo, 2015, 01:02 am
Respuesta #1

ingmarov

  • Moderador Global
  • Mensajes: 4,702
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
Hola    Editado

Un error me parece es la forma en que asignas cad=cad[i-1], en lugar de cad[i-strlen(cad)]=cad[i-1], esto tampoco funcionará ya por ejemplo en el primer paso estás asignando el primer elemento de la cadena "cad" al último elemento de la misma cadena, lo que provoca que borres el último elemento original, piensa que pasará cuando asignes el último elemento al primero.

Mejor genera otra cadena con la existente, algo como:

for(i=1;i<=strlen(cad);i++){
    cadinv[i-1]=cad[strlen(cad)-i];
  }

Faltarían detalles como definir la cadena cadinv, y si todo funciona correctamente y no te interesa seguir usando cadinv puedes asignar cad=cadinv.

Espero funcione. No lo probaré.

El problema de esta solución es que estás usando más memoria de la necesaria, al crear una cadena de más.
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

07 Mayo, 2015, 01:21 am
Respuesta #2

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
Me parece que eso tampoco va a funcionar, porque se sobreescriben los elementos de la primer mitad, los cuales se pierdren y no pueden ser copiados a la segunda mitad.
Cuando finalmente se copian, se trata de los caracteres modificados, lo cual queda mal.
Por ejemplo, "mundo" se convierte en "odndo".

Además, la cadena queda guardada como array de caracteres, con los índices yendo desde 0 hasta strlen(cad) - 1, así que el índice i debe comenzar en 0.
En realidad eso estaba bien, porque ingmarov pone "i-1" y con eso se arregla el índice.
De todos modos, yo uso siempre en C los índices de 0 hasta strlen(array) - 1, poniendo "i" en el índice, así que mi código sería éste:

Se necesita una variable temporal:

int i, temp, len;
ultimo = strlen(cad) - 1;
for(i=0; i < strlen(cad); i++){
    temp = cadinv[i];
    cadinv[i]=cad[ultimo - i];
    cad[ultimo - i] = temp;
}

07 Mayo, 2015, 01:39 am
Respuesta #3

ingmarov

  • Moderador Global
  • Mensajes: 4,702
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
Me parece que eso tampoco va a funcionar, porque se sobreescriben los elementos de la primer mitad, los cuales se pierdren y no pueden ser copiados a la segunda mitad.
Cuando finalmente se copian, se trata de los caracteres modificados, lo cual queda mal.
Por ejemplo, "mundo" se convierte en "odndo".
Además, la cadena queda guardada como array de caracteres, con los índices yendo desde 0 hasta strlen(cad) - 1, así que el índice i debe comenzar en 0.

Se necesita una variable temporal:

int i, temp, len;
ultimo = strlen(cad) - 1;
for(i=0; i < strlen(cad); i++){
    temp = cadinv[i-1];
    cadinv[i-1]=cad[ultimo - i];
    cad[ultimo - i] = temp;
}


Hace tiempo no uso C, y últimamente he estado aprendiendo sin prisa un poco de python.  Creo que el "i-1" debería ser solamente "i" ¿cierto?.

Pensaré en otra forma, que no requiera de dos arreglos.
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

07 Mayo, 2015, 01:51 am
Respuesta #4

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
Tenés razón ingmarov.
Retiro mi crítica, y corrijo mi código (que lo copié del tuyo, y no me fijé que decía "i-1" en vez de "i", y que por lo tanto estaba bien en ese aspecto).

Saludos.

07 Mayo, 2015, 09:47 pm
Respuesta #5

ingmarov

  • Moderador Global
  • Mensajes: 4,702
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
Hola

Bueno, una solución probada en python.

Código: [Seleccionar]

>>> cad="rinconmatematico"     #Cadena a invertir
>>> i=0
>>> cadi=""   #Defino otra cadena vacía
>>> while i<len(cad):
        cadi=cadi+cad[len(cad)-1-i]   #Esto significa por ejemplo para el primer paso añadir a la cadena "cadi" el último elemento de de "cad".
        i=i+1

>>> print(cadi)  #Este comando es para imprimir la cadena "cadi".
ocitametamnocnir #Este el resultado
>>>



Creo que se puede hacer algo similar en C usando la función  "strcat"
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...