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

 

 


Tema destacado: Top 20 herramientas Hacking más populares de 2020


+  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,377 veces)
Noxware

Desconectado Desconectado

Mensajes: 195



Ver Perfil
[AYUDA] Soy nuevo en C y tengo un problema con un codigo de 12 lineas simple
« en: 30 Octubre 2014, 01:51 am »

Hola, recién empece a aprender C hace poco y estaba probando unas cosas y encontré un error muy irracional que no comprendo porque es.

Para empezar el código es el siguiente:
Código
  1. #include <stdio.h>
  2.  
  3. void main(){
  4.        char temp[10];
  5.        int a = 5;
  6.  
  7.        while(a == a){
  8.            printf(">>> ");
  9.            scanf("%s", &temp);
  10.  
  11.        }        
  12.    }
  13.  

esto desplega una consola que no hace paracticamente nada y que se ve asi:
Código:
>>>

si yo escribo una sola palabra no hay ningun problema:

Código:
>>> palabra1
y la consola queda:
Código:
>>>

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???


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
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.416



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

le estás diciendo al scanf que lea caracteres, el scanf no asume el espacio un caracter, así que el lee lo que hay antes del primer espacio, lo saca del buffer y termina, entonces se repite tu funcion, pero ahora tienes un buffer cargado, así que el repite la operacion por cada espacio... esto es util cuando vas a sacar datos diferentes como
Código:
hola 1 2.30

puedes sacar hola como string, 1 como int y 2.3 como float :P

si no quieres que suceda ese error debes limpiar el buffer
esta es una linea que sirve para eso
Código
  1. while ( getchar() != '\n' );
lo que hace es leer hasta que consigue el enter

tambien
Código
  1. fseek(stdin,0,SEEK_END);
que usa la busqueda para en el buffer de entrada (stdin) pararse al final


ese es el asunto con C que es de más bajo nivel que casi todos los comunes y al programador le toca hacer las verificaciones que se asumen obvias pero esos huecos son los que dan real control


« Última modificación: 30 Octubre 2014, 02:04 am por engel lex » 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 #2 en: 30 Octubre 2014, 02:15 am »

Y como hago para que leea todo el string??? osea si quisiera imprimir todo lo que ingrese como lo haria???? porque al hacerlo asi solo me va a cargar la primera palabra pero no el resto....
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
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.416



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

puedes empezar con c++ que te hace más facil mucho del trabajo...
#include <stdio.h>
 
Código
  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4.        char temp[10];
  5.        int a = 5;
  6.  
  7.        while(a == a){
  8.            cout << ">>> ";
  9.            cin >> temp;
  10.        }        
  11.        return 0;
  12. }


o si quieres hacerlo en c puedes hacer esto

Código
  1. fgets(temp, 10, stdin); //capturas 10 caracteres del buffer de entrada
  2. strtok(temp, "\n");//quita el salto de linea
  3.  


por cierto... cuidado con otras cosas como intentar comparar cadenas de variables, ya que si haces

Código
  1. a==b
y son char de 10... recuerda que nunca dejan de ser de 10 y el resto que no escribiste contiene "basura" así que no serán iguales
« Última modificación: 30 Octubre 2014, 02:46 am por engel lex » 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 #4 en: 30 Octubre 2014, 02:42 am »

El código en C++ que me pasaste me da el mismo problema que tuve al inicio :(
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
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.416



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

ya! XD cierto que cin tambien lo hace, pero con cin es más simple igual y tambien había olvidado el salto de linea

Código
  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4.    char temp[10];
  5.    int a = 5;
  6.  
  7.    while(a == a){
  8.        cout << ">>> ";
  9.        cin.getline(temp,10);
  10.        cout << endl;//salto de linea
  11.    }        
  12.    return 0;
  13. }
  14.  
« Última modificación: 30 Octubre 2014, 02:53 am por engel lex » 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 #6 en: 30 Octubre 2014, 13:37 pm »

Y como hago para que leea todo el string??? osea si quisiera imprimir todo lo que ingrese como lo haria???? porque al hacerlo asi solo me va a cargar la primera palabra pero no el resto....

* Si quisieras seguir usando scanf para captar la cadena con espacios usarías:

Código
  1. scanf("%[^\n]s", temp) ;

* No hace falta el uso de una variable como "a" y hacer luego "a==a" para procvocar un bucle infinito. Más breve sería usar:

Código
  1. while ( 1 )

* Ten en cuenta que "temp" es un array por lo que sobra "& en el scanf.

* La función "main" es de tipo "int" por lo que requiere a su vez un return de entero.

Vamos que podría ser 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]s", temp) ;
  8.   printf( "%s\n" , temp ) ;          
  9.   while ( getchar() != '\n' ) ;
  10.  }
  11.  return 0 ;}

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


En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.416



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

leosansan yo intenté eso pero me dice que ^\n no fue reconocido :s por eso ni lo intenté
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.
_Enko


Desconectado Desconectado

Mensajes: 538



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

Soy realmente innepto en Cpp/C pero....

No seria:

Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <string.h>
  4.  
  5. int  main ( void ) {
  6. char temp [100] ;
  7.   do {
  8.   printf ( ">>> " ) ;
  9.   scanf("%[^\n]s", temp) ;
  10.   printf( "%s\n" , temp ) ;          
  11.   }while ( (getchar() != '\n')  ||  (strcmp(temp, "END")!= 0) ) ;
  12. system("PAUSE");
  13. return 0 ;
  14. }
  15.  

Digo mas que nada porque el bucle infinito me parece como mala práctica.
« Última modificación: 30 Octubre 2014, 15:58 pm por _Enko » 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 #9 en: 30 Octubre 2014, 17:26 pm »

Algunos comentarios ...

tambien
Código
  1. fseek(stdin,0,SEEK_END);
que usa la busqueda para en el buffer de entrada (stdin) pararse al final
El problema con fseek es que tal vez funcione o tal vez no, mejor utilizar un bucle para descartar el resto de la linea:
Código
  1. {
  2.   int ch;
  3.  
  4.   while ((ch = getchar()) != EOF && ch != '\n')
  5.      ;
  6. }
Se debe comparar contra EOF para evitar el caso donde la función getchar falla, retorna EOF y ello resulta en un bucle infinito.


* Si quisieras seguir usando scanf para captar la cadena con espacios usarías:

Código
  1. scanf("%[^\n]s", temp) ;
Cuando se desea indicar un conjunto de caracteres el especificador de formato es "%[]", la 's' después de este no hace daño pero esta de mas.


leosansan yo intenté eso pero me dice que ^\n no fue reconocido :s por eso ni lo intenté
Si estas compilando el código fuente como C debería reconocerlo, es la forma de indicar que los caracteres validos son los distintos al conjunto indicado.


Digo mas que nada porque el bucle infinito me parece como mala práctica.
Depende del programa si un bucle infinito es valido o no.

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,801 Ú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,160 Último mensaje 20 Enero 2012, 22:15 pm
por Anastacio
problema en simple codigo
Programación C/C++
elkiy 3 5,633 Ú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,045 Último mensaje 14 Agosto 2014, 21:57 pm
por Eternal Idol
Tengo un simple problema con una definición
Hacking Básico
556eknown 3 677 Último mensaje 26 Febrero 2020, 13:07 pm
por 556eknown
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines