Discussion:
Problema con cadenas
(demasiado antiguo para responder)
Pi
2005-11-22 17:31:04 UTC
Permalink
Hola!
Estoy practicando con un pequeño programa, intento recoger un texto y
darle la vuelta, pero solo consigo hacerlo con la primera palabra.
¿que estoy haciendo mal en este programa?, he leido/buscando
soluciones que las cadenas terminan en \0, asi que supongo que cuando
le doy a la barra espaciadora el programa considera que ya es 0, pero
no se como decirle que no es 0, que siga leyendo :-?.

Gracias por vuestro tiempo y ayuda..

/*
Name:Espejo
Date: 22/11/05 18:09
Description: Este programa invierte un texto dado
*/
#include <string.h>
#include <stdio.h>

void imp_inversa(char *s);
char t , s[];
main ()
{

printf ("escribe un texto:\n");
scanf ("%s", &s);
imp_inversa(s);
return 0;

}
void imp_inversa (char *s)
{

for (t=strlen(s)-1;t>=0; t--)putchar (s[t]);
}

/*GNU/GPL Licensed by PI. Anno 7D5*/
McLeod / IdeaFix
2005-11-22 17:41:24 UTC
Permalink
Post by Pi
printf ("escribe un texto:\n");
scanf usado con %s sólo coge la primera palabra. Para pedir frases
enteras por teclado, se usa gets() o similar.

Por cierto... las variables t, y s, como globales... uffff! Mala
estructuración. La variable t debería ser local a la función
imp_inversa, y s, local a main.

Además... s debe llevar una dimensión, si no, es un simple puntero con
tendencia a volverse loco.

Ah! Y en ese scanf, la "s" no debería llevar el & ya que "s" en sí
misma, es un puntero. Seguramente la cadena la esté escribiendo en la
zona de variables globales, donde quizás haya espacio suficiente para
una palabra corta, y el sistema no haya saltado... de milagro.
Pi
2005-11-22 18:02:27 UTC
Permalink
Post by McLeod / IdeaFix
scanf usado con %s sólo coge la primera palabra. Para pedir frases
enteras por teclado, se usa gets() o similar.
Por cierto... las variables t, y s, como globales... uffff! Mala
estructuración.
Además... s debe llevar una dimensión,
Ah! Y en ese scanf, la "s" no debería llevar el & ya que "s" en sí
misma, es un puntero. .... el sistema no haya saltado... de milagro.
**Muchisimas gracias McLeod/IdeaFix, he aprendido mas con tu correo que
con una hora dando vueltas por la red para encontra la solución.
Finalmente ha quedado así, y funciona.
Gracias
Pi.

#include <string.h>
#include <stdio.h>

void imp_inversa(char *s);

main ()
{
char s [100];
printf ("escribe un texto:\n");
gets (s);
imp_inversa(s);
return 0;

}
void imp_inversa (char *s)
{
char t;
for (t=strlen(s)-1;t>=0; t--)putchar (s[t]);
}
/*GNU/GPL Licensed by PI.Anno 7D5*/
Antoine Leca
2005-11-23 15:45:43 UTC
Permalink
Para pedir frases enteras por teclado, se usa gets() o similar.
Por favor: fgets()

No se debería usar jamás gets(), y menos enseñarlo a los incipientes.


Antoine
Olaf "El Blanco"
2005-11-29 14:13:05 UTC
Permalink
Porque no se debería usar jamás?
Post by Antoine Leca
Para pedir frases enteras por teclado, se usa gets() o similar.
Por favor: fgets()
No se debería usar jamás gets(), y menos enseñarlo a los incipientes.
Antoine
Antoine Leca
2005-11-29 14:30:08 UTC
Permalink
Porque [gets()] no se debería usar jamás?
Por que no hay forma humana de protegerte contra una entrada más grande que
lo que tu esperes. Y a su vez, una entrada demasiado grande tiene mucha
probabilidad de pisar la pila, en particular la dirección de la función
llamadora (buffer overflow).


Antoine
Olaf "El Blanco"
2005-11-29 20:31:24 UTC
Permalink
Se agradece...
pensaba que escribía hasta que se llene el buffer. -Unos pocos caracteres y
luego unos sonidos-

Parece que necesito aprender de otra clase de códigos.
Que me recomiendas, tengo instalado el Suse y el XP.
Post by Antoine Leca
Porque [gets()] no se debería usar jamás?
Por que no hay forma humana de protegerte contra una entrada más grande que
lo que tu esperes. Y a su vez, una entrada demasiado grande tiene mucha
probabilidad de pisar la pila, en particular la dirección de la función
llamadora (buffer overflow).
Antoine
Antoine Leca
2005-12-01 11:57:30 UTC
Permalink
Post by Olaf "El Blanco"
Se agradece...
pensaba que escribía hasta que se llene el buffer.
No. Por la buena razón que no sabe dónde se acaba el buffer (mira bién y
verás que nunca le pases el tamaño: eso es la indicación inequivocada que
hay un problema concelado...)
Post by Olaf "El Blanco"
Que me recomiendas, tengo instalado el Suse y el XP.
Me da ígual (aunque no he visto el código de XP ;-)).

Por otro lado si mires OpenBSD verás un esfuerzo consciente para evitar esos
problemas. No digo que OpenBSD siga la mejor solución, pero se esfuerza
sobre todo en este sentido, por lo cual se ve mejor que se trata en general.


Antoine

J.A. Gutierrez
2005-11-23 08:39:42 UTC
Permalink
Pi <***@gmail.com> wrote:
: Hola!
: Estoy practicando con un pequeño programa, intento recoger un texto y
: darle la vuelta, pero solo consigo hacerlo con la primera palabra.

Esa utilidad, en algunos Unix se llamaba "rev":


- rev.c -------------------------------------------------------------------
/*
* SPDsoft 98
* Replacement for the SunOS 4.x rev(1)
* rev - reverse the order of characters in each line
* rev [ filename ] ...
*/

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
char str[2048];
int i, j;
FILE *f;

if (argc == 1)
argc++;

for( argv++ ; argc > 1; argv++, argc--)
{
if ( *argv == NULL )
f=stdin;
else
if ( NULL == ( f=fopen(*argv, "r")))
perror(*argv);

if ( f != NULL )
{
fgets(str,sizeof(str),f);
while (!feof(f))
{
if (str[0] != 0)
{
i = strlen(str) - 2;
j = 0;
while (j < i)
{
str[j] ^= str[i];
str[i] ^= str[j];
str[j++] ^= str[i--];
}
}
fputs(str,stdout);
fgets(str,sizeof(str),f);
}
fclose(f);
}
}
exit (0);
}
---------------------------------------------------------------------------
--
PGP and other useless info at \
http://webdiis.unizar.es/~spd/ \
finger://daphne.cps.unizar.es/spd \ Timeo Danaos et dona ferentes
ftp://ivo.cps.unizar.es/pub/ \ (Virgilio)
Loading...