[AYUDA] Soy nuevo en C y tengo un problema con un codigo de 12 lineas simple

Iniciado por Noxware, 30 Octubre 2014, 01:51 AM

0 Miembros y 2 Visitantes están viendo este tema.

Noxware

leosansan me podrias explicar el siguiente codigo que me pasaste (el cual me funciono):
#include <stdio.h>

int  main ( void ) {
  char temp [100] ;
  while ( 1 ) {
   printf ( ">>> " ) ;
   scanf("%[^\n]s", temp) ; ///////////
   printf( "%s\n" , temp ) ;      ///////////// 
   while ( getchar() != '\n' ) ; //////////
  }
  return 0 ;}


como dije soy nuevo en C y no se mucho de C, hasta ahora solo habia programado en Python y en Java (muy poco)...... explicame especialmente los que te marque con barras de comentarios... las expresiones regulares...... porque no usate "&" para almacenar los datos en una parte de la memoria....... que es getchar....... y que es ese while al final..... gracias
"La mejor forma de conocer a una persona es viendo su código... o en una partida de ajedrez...

PD: Si no tengo faltas de ortografía es porque use el autocorrector."

BloodSharp

No erá más facil usar gets() en lugar de getchar(), fxxxx() o scanf() y hacerse tanto lío con esas funciones?

#include <stdio.h>

int main()
{
    char temp[256];
    while(1)
         printf(">>> "),
         gets(temp);
     return 0;
}



Cita de: francoyo1998 en 30 Octubre 2014, 01:51 AMPero si le ingreso mas de una palabra, por ejemplo si le ingreso 4 palabras:
>>> palabra1 palabra2 palabra3 palabra4
la consola me queda:
>>> >>> >>> >>>

Porque sucede esto???


Considerá que tenés un buffer de 10 bytes (char temp[10];) y no podés agregar más de 9 letras, si querés ingresar más texto tenés que tener un buffer mayor... (Ejemplo char temp[256];)


B#



Noxware

el ejemplo de leosansan me fue mas util aunque como dije recien estoy aprendiendo C y no entiendo mucho su ejemplo
"La mejor forma de conocer a una persona es viendo su código... o en una partida de ajedrez...

PD: Si no tengo faltas de ortografía es porque use el autocorrector."

engel lex

Cita de: francoyo1998 en 30 Octubre 2014, 19:38 PM
leosansan me podrias explicar el siguiente codigo que me pasaste (el cual me funciono):
#include <stdio.h>

int  main ( void ) {
  char temp [100] ;
  while ( 1 ) {
   printf ( ">>> " ) ;
   scanf("%[^\n]s", temp) ; ///////////
   printf( "%s\n" , temp ) ;      ///////////// 
   while ( getchar() != '\n' ) ; //////////
  }
  return 0 ;}


como dije soy nuevo en C y no se mucho de C, hasta ahora solo habia programado en Python y en Java (muy poco)...... explicame especialmente los que te marque con barras de comentarios... las expresiones regulares...... porque no usate "&" para almacenar los datos en una parte de la memoria....... que es getchar....... y que es ese while al final..... gracias

las 3 lineas que marcaste

1- escanf a una expresion regular (regex)
2- printf de el string y \n que es salto de linea
3- va a leer caracteres hasta que getchar sea \n (el enter)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Noxware

y ese while al final y simple??? porque no tiene nada adentro???
"La mejor forma de conocer a una persona es viendo su código... o en una partida de ajedrez...

PD: Si no tengo faltas de ortografía es porque use el autocorrector."

engel lex

si el while no tiene llaves (al igual que el if y el for) corren la siguiente linea o hasta conseguir ";"

el getchar tiene un apuntador automatico interno, cada vez que se usa se mueve un paso hacia adelante, así que se le hace "caminar" hasta que consiga el salto de linea, para así sacarlo del buffer
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Noxware

gracias por toda la ayuda, seguire leyendo sobre C y tarde o temprano sobre C++

algun manual corto para pasar de C a C++ luego???
"La mejor forma de conocer a una persona es viendo su código... o en una partida de ajedrez...

PD: Si no tengo faltas de ortografía es porque use el autocorrector."

engel lex

de c a c++ las diferencias no son muchas, muchos (por no decir casi todos) los programas de c son comptaibles con c++, lo que agrega c++ principalmente es la orientacion a objetos...
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

leosansan

Cita de: francoyo1998 en 30 Octubre 2014, 22:04 PM
y ese while al final y simple??? porque no tiene nada adentro???

Para aclarar eso antes indicarte que cuando escribes del teclado para introducir datos estos no los coge directamente el scanf o función similar, sino que van a lo que se llama buffer o memoria intermedia y es de ahí de donde el scanf toma los datos. pueden ocurrir dos cosas:

* El número de caracteres introducidos es inferior al tamaño del array o dato. En este caso el scanf tomará todos los caracteres del buffer "excepto" el caracter retorno de línea que se quedará en el buffer. Eso hace que al ejecutarse el ciclo al encontrarse el retorno de línea en el buffer se salte el scanf y entre en un bucle infinito. Por lo tanto hay que eliminar el retorno de línea del buffer antes de llegar al scanf nuevamente. Una opción sería poner un getchar, que es una función  que lee un caracter del buffer, después del scanf, algo como:

Código (cpp) [Seleccionar]
#include <stdio.h>

int  main ( void ) {
  char temp [100] ;
  while ( 1 ) {
   printf ( ">>> " ) ;
   scanf ("%[^\n]" , temp) ;
   printf ( "%s\n" , temp ) ;
   getchar ( ) ;           
  }
  return 0 ;
}


O bien, recuerda que he dicho que has introducido menos caracteres que el tamaño del array, hacer que el scanf, al tiempo que lee el dato consuma el retorno de línea del buffer, cosa que podemos conseguir haciendo:

Código (cpp) [Seleccionar]
#include <stdio.h>

int  main ( void ) {
  char temp [100] ;
  while ( 1 ) {
   printf ( ">>> " ) ;
   scanf ("%[^\n]%c" , temp) ;
   printf ( "%s\n" , temp ) ;           
  }
  return 0 ;
}


Fíjate que el scanf lee la cadena y otro caracter que sería el retorno de línea y de esa forma eliminamos el mismo del buffer y ya no dará problemas.

* Pero si el total de caracteres que introduces es superior al tamaño máximo que has declarado en el array, ahora hay que eliminar ese exceso. En este caso es cuando es útil el bucle del while con el getchar ya que mientras quede algún caracter en el buffer el getchar los irá consumiendo hasta limpiar el buffer de forma que cuando termina se ejecuta el while principal y el scanf funciona sin problemas al no haber ya nada previo en el buffer, con lo que procede a leer el nuevo dato introducido.

Y así sucesivamente.

Espero no haberte liado más, sino todo lo contrario y no haber metido la pata con la explicación que a fuerza de ser breve puede ocurrir.

Un fuerte saludo francoyo1998 .


rir3760

Cita de: francoyo1998 en 30 Octubre 2014, 22:04 PMy ese while al final y simple??? porque no tiene nada adentro?
Porque en C es obligatorio indicar el cuerpo de un bucle.

En el caso que comentas:
{
   int ch;
   
   while ((ch = getchar()) != EOF && ch != '\n')
      ; /* sentencia nula ==> ninguna operacion */
}

La operación necesaria (descarte del resto de la linea) se realiza en la condición del bucle, no hay nada mas que hacer pero las reglas del lenguaje imponen indicar el cuerpo si o si. Por ello utilizamos una sentencia nula (nada) la cual se indica con el punto y coma inmediatamente después de la condición.

----

Cita de: leosansan en 31 Octubre 2014, 04:39 AMscanf("%[^\n]%c" , temp);

Espero no haberte liado más, sino todo lo contrario y no haber metido la pata con la explicación
Toda la explicación es correcta salvo un detalle en esa llamada a función: al utilizar "%c" se debe indicar mediante un puntero la variable donde se almacenara el carácter, si se desea simplemente descartar al susodicho se debe utilizar "%*c".

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language