Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: amchacon en 10 Marzo 2014, 20:49 pm



Título: Sobre la lectura de variables...
Publicado por: amchacon en 10 Marzo 2014, 20:49 pm
Buenas.

Suponte, que quiero leer los números:
Citar
2 5

Yo haría:
Código
  1. int numero,numero2;
  2. cin>>numero>>numero2;

Y perfecto. ¿Pero que pasaría si hubiese una coma en lugar de un espacio?
Citar
2,5

¿Como cambio el delimitador de cin para poder leerlos directamente?


Título: Re: Sobre la lectura de variables...
Publicado por: leosansan en 10 Marzo 2014, 23:36 pm
Buenas.

Suponte, que quiero leer los números:
Yo haría:

Código
  1. int numero,numero2;
  2. cin>>numero>>numero2;
  3.  

Y perfecto. ¿Pero que pasaría si hubiese una coma en lugar de un espacio?
¿Como cambio el delimitador de cin para poder leerlos directamente
?



No sé si es un caso aislado o es una lectura fija, como por ejemplo en la introducción de coordenadas. Si es este último caso valdría:

Código
  1. .....................................
  2. char ch;
  3. int numero,numero2;
  4. cin>>numero>>ch>>numero2;
  5. cout << numero<<"  "<<numero2<<endl;
  6. ..................................
  7.  


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)




Título: Re: Sobre la lectura de variables...
Publicado por: amchacon en 11 Marzo 2014, 01:58 am
Eso no funcionaría porque el primer cin lee hasta el espacio. Y como no hay espacio leeria los dos numeros del tirón.


Título: Re: Sobre la lectura de variables...
Publicado por: leosansan en 11 Marzo 2014, 02:01 am
Eso no funcionaría porque el primer cin lee hasta el espacio. Y como no hay espacio leeria los dos numeros del tirón.

No, pruébalo que funciona. La variable ch se "come" la coma y cada número estará en su sitio. A mí me funcionó.

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Sobre la lectura de variables...
Publicado por: amchacon en 11 Marzo 2014, 02:06 am
Anda xD. Pues si.

Asi que solo había que cargarse la coma, me estoy volviendo viejo ;D

¡Gracias! ^^


Título: Re: Sobre la lectura de variables...
Publicado por: Yoel Alejandro en 11 Marzo 2014, 02:38 am
Hola!!! Bueno, en C++ no conozco un método que no sea el propuesto por leosansan.

Pero hurgando en los papeles encontré una función de biblioteca de C llamada strtok() (requiere <string.h>) que me despertó curiosidad. Funciona precisamente en casos como éstos, su finalidad es "dividir una cadena en componentes léxicos". Sea la cadena s1, que se quiere dividir en componente léxicos, por medio de un token separador dado por la cadena (no carácter) s2. Entonces la llamada

strtok(s1, s2);

extrae de s1 el primer componente léxico, hasta llegar al token delimitador (o al final de s1 si no se encontró dicho delimitador). La función devuelve una cadena que corresponde al componente extraído. Las llamadas subsiguientes a strtok() deben hacerse con NULL como primer argumento, y de allí en adelante se siguen extrayendo los siguientes componentes de la cadena, devolviendo NULL cuando no existan más de ellos.

En el ejemplo a continuación el usuario introduce cualquier secuencia como "1,2,3,4", y el programa devuelve las distintas divisiones encontradas de la cadena, según el delimitador ","

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. int main() {
  6.  
  7. char buf[101];
  8. char *s;
  9.  
  10. scanf( "%s", buf );
  11.  
  12. if ( ( s = strtok( buf, ",") ) != NULL )           /* primer componente */
  13. printf( "%s\n", s );
  14. while ( ( s = strtok( NULL, ",") ) != NULL )  /* restantes, hasta llegar al final */
  15. printf( "%s\n", s1 );
  16. }

===========================================
(EDITO)

A propósito del tema, estaba revisando que la función strtok(char* s1, const char *s2) acepta en s2 una cadena donde cualquiera de sus caracteres puede funcionar como delimitador. Esto puede aumentar la potencia del programa, por ejemplo si s2=",." entonces cualquiera de los caracteres coma o punto será un delimitador. El programa con la entrada "1,2.3.4" separará en 1, 2, 3, 4
Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. int main() {
  6.  
  7.   char buf[101];
  8.   char *s1;
  9.  
  10.   scanf( "%s", buf );
  11.  
  12.   if ( ( s1 = strtok( buf, ",.") ) != NULL )
  13.      printf( "%s\n", s1 );
  14.   while ( ( s1 = strtok( NULL, ",.") ) != NULL )
  15.      printf( "%s\n", s1 );
  16. }

NOTA. No funciona el espacio como separador debido a scanf(). Si se reemplaza por fgets() sí lo podría aceptar.