Pipes, scanf, y manual de C

2003-12-23 Por tema Alberto
Hola a todos,

tengo un programa en C que hace lo siguiente:

//cliente
char str[256];
scanf(%s, str);
write (envio, str, strlen(str));

donde envio es el canal que apunta a una pipe.

por otro lado, otro proceso lee de la pipe:

//servidor
read(recept, str, strlen(str));


donde recept es el canal que apunta a la pipe. 

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?


De paso, hay alguna pagina oficial de C? alguna como el manual de Java que 
tienen en la de sun.

Gracias!





---Publicidad
Únete a los miles de sin pareja en Meetic... ¡te vas a enamorar!
http://www.iespana.es/_reloc/email.meetic



Re: Pipes, scanf, y manual de C

2003-12-23 Por tema Fernando M. Maresca
On Tue, Dec 23, 2003 at 11:47:52AM +0100, Alberto wrote:
 Hola a todos,
 
 tengo un programa en C que hace lo siguiente:
 
 //cliente
 char str[256];
 scanf(%s, str);
/* el segundo argumento debe ser un puntero */
scanf(%s, str);

 write (envio, str, strlen(str));
 
 donde envio es el canal que apunta a una pipe.
 
 por otro lado, otro proceso lee de la pipe:
 
 //servidor
 read(recept, str, strlen(str));
 
 
 donde recept es el canal que apunta a la pipe. 
 
 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?
 
 
 De paso, hay alguna pagina oficial de C? alguna como el manual de Java que 
 tienen en la de sun.
man funcion en Linux/Bsd te va a dar la página de manual de las
funciones de librería standard de C.
Comprate o conseguite el pdf de The C programing Language de Kernighan
y Ritchie. 
Sds
 
 Gracias!
 
 
 
 
 
 ---Publicidad
 Únete a los miles de sin pareja en Meetic... ¡te vas a enamorar!
 http://www.iespana.es/_reloc/email.meetic
 
 
 -- 
 To UNSUBSCRIBE, email to [EMAIL PROTECTED]
 with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
 

-- 

Fernando M. Maresca

Cel: (54) 221 15 502 3938
Cel: 0221-15-502-3938



Re: Pipes, scanf, y manual de C

2003-12-23 Por tema Ana Belén Barragáns Martínez
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-MarcosendeFax: +34-986812116
  36200 - Vigo   mailto: [EMAIL PROTECTED]
  Pontevedra (Spain)   URL: http://www-gris.det.uvigo.es/~belen
-





Re: Pipes, scanf, y manual de C

2003-12-23 Por tema José Manuel Pérez
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

El Martes, 23 de Diciembre de 2003 12:54, Fernando M. Maresca escribió:
 On Tue, Dec 23, 2003 at 11:47:52AM +0100, Alberto wrote:
  Hola a todos,
 
  tengo un programa en C que hace lo siguiente:
 
  //cliente
  char str[256];
  scanf(%s, str);

 /* el segundo argumento debe ser un puntero */
 scanf(%s, str);

Extraído de la página del man de scanf:

   s  Matches  a  sequence  of non-white-space characters; the next 
pointer must be a pointer to char, and the array must be large
  enough to accept all the sequence and the terminating NUL 
character.  The input string stops at white space or at the  maxi-
  mum field width, whichever occurs first.

Es decir, lo tenias bien, pero únicamente lee hasta el primer separador 
(espacio, tabulador, salto de línea, fin de fichero, etc.)


  write (envio, str, strlen(str));
 
  donde envio es el canal que apunta a una pipe.
 
  por otro lado, otro proceso lee de la pipe:
 
  //servidor
  read(recept, str, strlen(str));
 
 
  donde recept es el canal que apunta a la pipe.
 
  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?
 
 
  De paso, hay alguna pagina oficial de C? alguna como el manual de Java
  que tienen en la de sun.

 man funcion en Linux/Bsd te va a dar la página de manual de las
 funciones de librería standard de C.
 Comprate o conseguite el pdf de The C programing Language de Kernighan
 y Ritchie.
 Sds

  Gracias!
 
 
 
 
 
  ---Publicidad
  Únete a los miles de sin pareja en Meetic... ¡te vas a enamorar!
  http://www.iespana.es/_reloc/email.meetic
 
 
  --
  To UNSUBSCRIBE, email to [EMAIL PROTECTED]
  with a subject of unsubscribe. Trouble? Contact
  [EMAIL PROTECTED]

 --

 Fernando M. Maresca

 Cel: (54) 221 15 502 3938
 Cel: 0221-15-502-3938

- -- 
- --+---
José Manuel Pérez Fuente  | Universidad del País Vasco
Punto Neutro EuskoNIX (UPV/EHU)   | E-mail: [EMAIL PROTECTED]
Plaza Elhuyar, 1 (Edif. Barriola) | Tel.:  +34 943 018 281
20018 San Sebastián (SPAIN)   | Fax.:  +34 943 219 306
- --+---

-BEGIN PGP SIGNATURE-
Version: GnuPG v1.2.3 (GNU/Linux)

iD8DBQE/6D0rRRyB6LZLkhsRAhLyAJ9tFqaxJykUbt5nVb5iD0mxwh6ntgCePfq1
RvzgzXxatPnptuvwTdhx3ZM=
=QbLg
-END PGP SIGNATURE-



Re: Pipes, scanf, y manual de C

2003-12-23 Por tema Pedro M. López

At 23/12/03 11:47, Alberto wrote:

Hola a todos,

tengo un programa en C que hace lo siguiente:

//cliente
char str[256];
scanf(%s, str);
write (envio, str, strlen(str));

donde envio es el canal que apunta a una pipe.

por otro lado, otro proceso lee de la pipe:

//servidor
read(recept, str, strlen(str));


donde recept es el canal que apunta a la pipe.

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?


De paso, hay alguna pagina oficial de C? alguna como el manual de Java que
tienen en la de sun.

Gracias!




Si no recuerdo mal el C debería ser algo como esto
//cliente
char str[256];
scanf(%s, str);
write (envio, str, strlen(str)); /*no  se puede poner el , str ya es un 
puntero*/


//servidor
read(recept, str, strlen(str)); /*otra vez lo mismo*/

Prueba con esto y cuentanos

Un saludo
Pedro 



RE: Pipes, scanf, y manual de C

2003-12-23 Por tema Nerox NRX





From: Alberto [EMAIL PROTECTED]
To: debian-user-spanish@lists.debian.org
Subject: Pipes, scanf, y manual de C
Date: Tue, 23 Dec 2003 11:47:52 +0100

Hola a todos,

tengo un programa en C que hace lo siguiente:

//cliente
char str[256];
scanf(%s, str);
write (envio, str, strlen(str));



Para leer puedes emplear scanf(^\n,string); leera todo (incluido espacios) 
hasta que encuentre '\n' (pulses intro), puedes cambiar \n por otra letra o 
secuencia cualquiera.


_
Deja tu CV y recibe ofertas personalizadas de trabajo en tu buzón. 
http://www.msn.es/Empleo/