[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Pipes, scanf, y manual de C



El mar, 23-12-2003 a las 10:47, Alberto escribió:
[...]
> //cliente
> char str[256];
> scanf("%s", str);
> write (envio, &str, strlen(str));
[...]
> Pues bien, parece ser que si en cliente le introduces por ejemplo ls -l -a, 
> el servidor lee de la pipe solamente ls !!!
> 
> Osea que parece ser que dicho comando el scanf lo guarde en lugar de "ls -l 
> -a\0", como "ls\0 -l\0 -a\0" !!!! o es el scanf que me extraña muchísimo por 
> que no sabría por qué hace eso, o es el write, que tampoco veo por que, o es 
> la lectura de la pipe en el read. 
> 
> No me equivoco si afirmo que scanf guardaría una frase como "El perro de san 
> Roque\0" verdad?

Hola, 

Haz man scanf y comprobarás que detiene la lectura de la cadena 
al encontrar el primer blanco. Si supieses que son exactamente tres
cadenas, podrías hacer: scanf("%s %s %s",str1,str2,str3);
pero esto es bastante poco flexible. Usa gets() si quieres, esta función
te permite leer toda la entrada saltándose los blancos, pero eso sí,
como te advierte la página del man:

"Puesto que es imposible saber,  sin  conocer  de  antemano  los  datos,
cuántos  caracteres  va  a  leer gets(), y puesto que gets() continuará
guardando caracteres una vez alcanzado el final del búfer, su empleo es
extremadamente peligroso. Muchas veces ha sido utilizado para
comprometer la seguridad de un sistema. En su lugar emplee fgets()
siempre  que pueda."

Saludos,

Belén

-------------------------------------------------------------------------
  Ana Belén Barragáns Martínez    
  Departamento de Enxeñería Telemática    
  E.T.S.E. Telecomunicación                          Tlf: +34-986812181
  Campus As Lagoas-Marcosende                        Fax: +34-986812116
  36200 - Vigo                               mailto: belen@det.uvigo.es
  Pontevedra (Spain)           URL: http://www-gris.det.uvigo.es/~belen
-------------------------------------------------------------------------





Reply to: