/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Colocar una cadena al reves.

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Anastacius



Registrado: 26 Oct 2013
Mensajes: 41

MensajePublicado: 24/06/2014 6:52 pm
Título: Colocar una cadena al reves.

Hola Smile Hacia mucho que no andaba por aca, pero la programacion siempre nos llama desde las sombras para acercarnos al teclado.

Tengo un ejercicio, en el cual, tengo que dar vuelta una cadena al reves (Libro Kernighan and Ritchie, segunda edicion). He probado dos soluciones diferentes con diferentes niveles de exito.
Código:

#include <stdio.h>
#include <string.h>
#define MAXLINE 1000

int main()
{
printf("Programa que coloca al reves una cadena\n");
int c, n;
char linea[MAXLINE];
n = 0;
while((c = getchar()) != '\n')
         {
         if(c != '\n')
          {
          linea[n] = c;
          n = n + 1;
          printf("%c\n",c);
          }
         }
printf("El array es: %s\n", linea);
while(n >= 0)
        {
        printf("%c",linea[n]);
        n = n - 1;
        }
       

getchar();
return 0;

 


Este funciona bien hasta cierto punto. Si yo coloco la cadena "Hola", me la da vuelta, pero agrega un "1" adelante. Ejemplo

Hola: 1aloH. Ademas, cuando imprime la cadena de forma normal (con el printf) me coloca[ Hola¨" ] . (sin los corchetes)

Es decir, creo que la logica esta bien, pero ahi hay algo que no termino de comprender...

El otro codigo tiene un problema similar.

Código:

#include <stdio.h>
#define MAXLINE 1000


int main()
{
  printf("Coloca la cadena al reves\n");
  int c, n, m, end;
  n = 0;
  m = 0;
  char line[MAXLINE];
  char enil[MAXLINE];
  while((c = getchar()) != EOF)
  {
           
           line[n] = c;
           n = n + 1;
           
           end = n;
           if(c == '\n')
           {
           
             
             
              while(end >= 0)
              {
              printf("End es igual a = %d\n",end); 
              enil[m] = line[n];
              m = m + 1;
              n = n - 1;
              end = end - 1;
              printf("%c\n",enil[m]);
              }
             
              printf("%s\n",enil);
           }   
 
  }
 
  return 0;
}



En este otro, agrega como cinco caracteres extraños mas, todos provenientes de las cuevas ASCII (lugares del ascii que nadie usa, jeje)

Si me pudiesen decir que estoy haciendo mal, les agradeceria muchisimo. Nos vemos Smile
_________________
Programacion en C - HTML - Batch -
Aprendiendo : Java...
Volver arriba
dehm



Registrado: 29 Abr 2011
Mensajes: 143

MensajePublicado: 25/06/2014 2:35 am
Título:

En el primer caso, parece que una vez que has capturado la entrada de datos y la has pasado al array, has de introducir el caracter '\0' de forma manual.
Es decir:
Código:
 .........................
      printf("%c\n",c);
                }
        }
    linea[n]='\0'; //aqui has de introducir el caracter de fin de cadena
    printf("El array es: %s\n", linea);
.....................................


Saludos!
_________________
Aprendiendo
Volver arriba
dehm



Registrado: 29 Abr 2011
Mensajes: 143

MensajePublicado: 25/06/2014 2:45 am
Título:

Bueno, matizo la respuesta.
El poner el caracter '\0' al final sería sólo para indicarle a printf dónde acaba la cadena que ha de mostrar.
Por eso lo del Hola¨" y similares.
Para que te empieze a mostrar desde el último caracter perteneciente a la cadena, has de retroceder al último caracter realmente introducido, ya que en tu bucle, incrementas el valor de n después de introducir un caracter.
Entoces puedes hacer:
Código:
n--; //ponemos n en el ultimo caracter antes de pulsar enter
while(n >= 0)
        {
        printf("%c",linea[n]);
        n = n - 1;
        }

_________________
Aprendiendo
Volver arriba
dehm



Registrado: 29 Abr 2011
Mensajes: 143

MensajePublicado: 25/06/2014 2:55 am
Título:

Y creo que si, en el segundo caso, al estar n una posición después de la frase, cuando m vale 0, ha de tener el valor de n-1, y no de n

Código:
enil[m] = line[n-1];


O decrementar n antes de entrar en el bucle.
Por cierto, tal como lo has planteado no va a hacer la asignación, ¿no?...bueno, yo es que he hecho algún cambio:
Código:
#include <stdio.h>
#define MAXLINE 1000


int main()
{
    printf("Coloca la cadena al reves\n");
    int c, n, m, final;
    n = 0;
    m = 0;
    char line[MAXLINE];
    char enil[MAXLINE];
    while((c = getchar()) != '\n')
        {
        line[n] = c;
        n = n + 1;
        final = n;
        }
    while(final >= 0)
        {
            printf("final es igual a = %d\n",final);
            enil[m] = line[n-1];
            m = m + 1;
            n = n - 1;
            final = final - 1;
            printf("%c\n",enil[m]);
        }

    printf("%s\n",enil);



    return 0;
}


Saludos![/i]
_________________
Aprendiendo
Volver arriba
Anastacius



Registrado: 26 Oct 2013
Mensajes: 41

MensajePublicado: 25/06/2014 4:37 am
Título:

Les agradezco mucho, ambos codigos funcionan perfectamente ahora Smile Es genial que exista un lugar en el mundo donde todos te ayuden Smile

Saludos a todos
_________________
Programacion en C - HTML - Batch -
Aprendiendo : Java...
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com