elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [AYUDA] Soy nuevo en C y tengo un problema con un codigo de 12 lineas simple
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] 3 Ir Abajo Respuesta Imprimir
Autor Tema: [AYUDA] Soy nuevo en C y tengo un problema con un codigo de 12 lineas simple  (Leído 5,175 veces)
Noxware

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: [AYUDA] Soy nuevo en C y tengo un problema con un codigo de 12 lineas simple
« Respuesta #10 en: 30 Octubre 2014, 19:38 pm »

leosansan me podrias explicar el siguiente codigo que me pasaste (el cual me funciono):
Código
  1. #include <stdio.h>
  2.  
  3. int  main ( void ) {
  4.  char temp [100] ;
  5.  while ( 1 ) {
  6.   printf ( ">>> " ) ;
  7.   scanf("%[^\n]s", temp) ; ///////////
  8.   printf( "%s\n" , temp ) ;      /////////////  
  9.   while ( getchar() != '\n' ) ; //////////
  10.  }
  11.  return 0 ;}
  12.  

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


En línea

"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


Desconectado Desconectado

Mensajes: 576


Crianosfera 5 in comming!!!


Ver Perfil
Re: [AYUDA] Soy nuevo en C y tengo un problema con un codigo de 12 lineas simple
« Respuesta #11 en: 30 Octubre 2014, 20:17 pm »

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

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.     char temp[256];
  6.     while(1)
  7.          printf(">>> "),
  8.          gets(temp);
  9.     return 0;
  10. }


Pero si le ingreso mas de una palabra, por ejemplo si le ingreso 4 palabras:
Código:
>>> palabra1 palabra2 palabra3 palabra4
la consola me queda:
Código:
>>> >>> >>> >>>

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#
 


« Última modificación: 30 Octubre 2014, 20:20 pm por IEAX » En línea



Noxware

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: [AYUDA] Soy nuevo en C y tengo un problema con un codigo de 12 lineas simple
« Respuesta #12 en: 30 Octubre 2014, 20:50 pm »

el ejemplo de leosansan me fue mas util aunque como dije recien estoy aprendiendo C y no entiendo mucho su ejemplo
En línea

"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
Colaborador
***
Desconectado Desconectado

Mensajes: 15.347



Ver Perfil
Re: [AYUDA] Soy nuevo en C y tengo un problema con un codigo de 12 lineas simple
« Respuesta #13 en: 30 Octubre 2014, 21:53 pm »

leosansan me podrias explicar el siguiente codigo que me pasaste (el cual me funciono):
Código
  1. #include <stdio.h>
  2.  
  3. int  main ( void ) {
  4.  char temp [100] ;
  5.  while ( 1 ) {
  6.   printf ( ">>> " ) ;
  7.   scanf("%[^\n]s", temp) ; ///////////
  8.   printf( "%s\n" , temp ) ;      /////////////  
  9.   while ( getchar() != '\n' ) ; //////////
  10.  }
  11.  return 0 ;}
  12.  

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)
En línea

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

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: [AYUDA] Soy nuevo en C y tengo un problema con un codigo de 12 lineas simple
« Respuesta #14 en: 30 Octubre 2014, 22:04 pm »

y ese while al final y simple??? porque no tiene nada adentro???
En línea

"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
Colaborador
***
Desconectado Desconectado

Mensajes: 15.347



Ver Perfil
Re: [AYUDA] Soy nuevo en C y tengo un problema con un codigo de 12 lineas simple
« Respuesta #15 en: 30 Octubre 2014, 22:13 pm »

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
En línea

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

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: [AYUDA] Soy nuevo en C y tengo un problema con un codigo de 12 lineas simple
« Respuesta #16 en: 30 Octubre 2014, 22:51 pm »

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???
En línea

"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
Colaborador
***
Desconectado Desconectado

Mensajes: 15.347



Ver Perfil
Re: [AYUDA] Soy nuevo en C y tengo un problema con un codigo de 12 lineas simple
« Respuesta #17 en: 30 Octubre 2014, 23:01 pm »

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...
En línea

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


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: [AYUDA] Soy nuevo en C y tengo un problema con un codigo de 12 lineas simple
« Respuesta #18 en: 31 Octubre 2014, 04:39 am »

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
  1. #include <stdio.h>
  2.  
  3. int  main ( void ) {
  4.  char temp [100] ;
  5.  while ( 1 ) {
  6.   printf ( ">>> " ) ;
  7.   scanf ("%[^\n]" , temp) ;
  8.   printf ( "%s\n" , temp ) ;
  9.   getchar ( ) ;            
  10.  }
  11.  return 0 ;
  12. }

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
  1. #include <stdio.h>
  2.  
  3. int  main ( void ) {
  4.  char temp [100] ;
  5.  while ( 1 ) {
  6.   printf ( ">>> " ) ;
  7.   scanf ("%[^\n]%c" , temp) ;
  8.   printf ( "%s\n" , temp ) ;          
  9.  }
  10.  return 0 ;
  11. }

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 .

En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [AYUDA] Soy nuevo en C y tengo un problema con un codigo de 12 lineas simple
« Respuesta #19 en: 31 Octubre 2014, 16:03 pm »

y 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:
Código
  1. {
  2.   int ch;
  3.  
  4.   while ((ch = getchar()) != EOF && ch != '\n')
  5.      ; /* sentencia nula ==> ninguna operacion */
  6. }
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.

----

Código
  1. scanf("%[^\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
En línea

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
Páginas: 1 [2] 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con varias lineas de código [C++]
Programación C/C++
Don Pollo 4 2,745 Último mensaje 15 Junio 2011, 12:58 pm
por Don Pollo
Tengo un problema en un programa simple, no entiendo cual es. « 1 2 »
Programación C/C++
Anastacio 12 4,008 Último mensaje 20 Enero 2012, 22:15 pm
por Anastacio
problema en simple codigo
Programación C/C++
elkiy 3 5,573 Último mensaje 26 Marzo 2013, 01:16 am
por avesudra
[Solucionado] Problema con simple código en C++
Programación C/C++
Mario Olivera 1 1,008 Último mensaje 14 Agosto 2014, 21:57 pm
por Eternal Idol
Tengo un simple problema con una definición
Hacking Básico
556eknown 3 579 Último mensaje 26 Febrero 2020, 13:07 pm
por 556eknown
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines