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

 

 


Tema destacado:


  Mostrar Mensajes
Páginas: 1 ... 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 [49] 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 ... 235
481  Programación / Programación C/C++ / Re: ¿Queda algo en el Buffer de Entrada stdin? en: 24 Noviembre 2018, 22:16 pm
Realmente no importa lo que queda en el buffer. Ya que si vaciamos el buffer de stdin no se volvera a llenar hasta que volvamos a llamar a una funcion tipo fgets, gets, scanf... etc.

Ejemplo:

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. int main() {
  5. int len,i = 0;
  6. char temporal[10];
  7. char c;
  8. printf("Ingrese una cadena: ");
  9. fgets(temporal,10,stdin);
  10. printf("Cadena Leida: %s\n",temporal);
  11. len = strlen(temporal);
  12. if(temporal[len - 1 ]  != 0xA) {
  13. while ((c = getchar()) != 0xA);
  14. }
  15. printf("Ingrese otra cadena: ");
  16. fgets(temporal,10,stdin);
  17. printf("Cadena Leida: %s\n",temporal);
  18. }
  19.  

Salida:



Saludos
482  Programación / Programación C/C++ / Re: ¿Queda algo en el Buffer de Entrada stdin? en: 24 Noviembre 2018, 21:50 pm
Tengo que decirles que después de meditarlo un poco, encontre la solución, se puede deducir leyendo la memoria que acabamos de leer, esto en el caso de Usar Fgets  ;-) ;-)

Si bien han usado en su momento fgets, recordaran que este guarda en la misma cadena que acaba de leer el "Enter" esto es un byte de valor 0xA (10 en decimal)

Esto siempre y cuando la longitud del texto leído no supere el tamaño del arreglo donde vamos a guardar nuestra cadena leida.

Vemos un ejemplo con Codigo:

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. int main() {
  5. int len,i = 0;
  6. char temporal[10];
  7. printf("Ingrese una cadena: ");
  8. fgets(temporal,10,stdin);
  9. len = strlen(temporal);
  10. printf("Cadena Leida: %s",temporal);
  11. printf("La longitud de la cadena leida es de %i\n",len);
  12. while(i<10) printf("%.2X",temporal[i++]);
  13. printf("\n");
  14. }
  15.  
  16.  

Aqui unas cuantas salidas.



1er caso de la imagen: ingresar mas de 9 letras "A", obvio hay datos en el buffer de stdin esperando ser leeidos,
2do caso de la imagen: Al ingresar exactamente 9 letras A, el ultimo byte del buffer el byte 10 es el valor nulo '\0' En este caso queda un Enter en el buffer de datos de stdin
3er caso de la imagen: Al ingresar exactamente 8 letras A, strlen sigue considerando 9 espacios usados ya que el Enter (0xA) esta el la posición temporal[8] y en temporal[9] esta el byte nulo '\0'
4to caso de la imagen: Al ingresar exactamente 7 letras A, strlen marca una longitud de 8 espacios mismo caso que el anterior sigue considerando el "Enter" como un valor valido de la cadena.

En conclusión, si al usar fgets correctamente, el valor de nuestro arreglo en su posición strlen(temporal) - 1 es igual 0xA entonces no queda nada en nuestro buffer de STDIN, en caso contrario si queda Algo, ya sea solo el Enter o Texto restante + Enter.

En cualquier caso después de realizar esta evaluación si detectamos el caso de que aun quede buffer pendiente por leer, podemos leerlo asi:

Código
  1. while ((c = getchar()) != 0xA);


Saludos
483  Programación / Programación C/C++ / ¿Queda algo en el Buffer de Entrada stdin? (Solucionado) en: 24 Noviembre 2018, 18:54 pm
Solución

Se encontraron 2 soluciones

  • Detectar en la memoria previamente leida por fgets si el buffer de destino tiene el retorno de linea, si esi ya no hay nada en STDIN, en caso contrario aun quedan datos.
  • realizar fseek al stdin para que avance hasta el final del archivo. (Solucion gracias a MAFUS)
Código
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. int main() {
  5. int len,i = 0;
  6. char temporal[10];
  7. char c;
  8. printf("Ingrese una cadena: ");
  9. fgets(temporal,10,stdin);
  10. printf("Cadena Leida: %s\n",temporal);
  11. len = strlen(temporal);
  12. if(temporal[len - 1 ]  != 0xA) {
  13. while ((c = getchar()) != 0xA);
  14. }
  15. printf("Ingrese otra cadena: ");
  16. fgets(temporal,10,stdin);
  17. printf("Cadena Leida: %s\n",temporal);
  18. }
  19.  


con fseek:


Código
  1. #include <stdio.h>
  2.  
  3.    int main() {
  4.        char c;
  5.        while(1) {
  6.            printf("> ");
  7.            c = getchar();
  8.            fseek(stdin, 0, SEEK_END);
  9.            printf("Caracter: %c\n", c);
  10.        }
  11.    }


Post Original

Muy buen dia aun que la pregunta en el titulo de este post parece una pregunta totalmente N00b. No lo es.

El objetivo del post es Dejar de utilizar fflush

Código
  1. fflush(stdin);

Yo no lo utilizo, o por lo menos trato de nunca recomendarlo, solo que ayer se lo recomendé a alguien y no me convence su implementación.  :silbar:

La verdad es que quiero dar por terminado el tema de la función fflush para el Buffer de entrada.

Todo esto en Lenguaje C  ;-)

La idea de este post viene de preguntas hechas en el foro similares a ¿Como filtrar todo tipo de datos de entrada en un programa?

Revisando algunas links en internet me encuentro con:
https://es.stackoverflow.com/questions/82431/saber-si-el-b%C3%BAfer-de-entrada-stdin-est%C3%A1-vac%C3%ADo-en-c-est%C3%A1ndar
http://man7.org/linux/man-pages/man3/fflush.3.html
http://www.cplusplus.com/reference/cstdio/fflush/

Sin embargo en todos ellos hablan de que el comportamiento de fflush para el stdin es Inesperado, por lo cual repetidamente dicen que no se debe de usar.

¿Cual es la solución para limpiar el buffer de entrada, si es que realmente queda algo en el?

Intente con feof, sin embargo al parecer NUNCA llega el fin del archivo para STDIN

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. int main() {
  5. char temporal[10];
  6. printf("Ingrese menos de 10 o mas de 10 caracteres\npara ver el comportamiento de feof(stdin): ");
  7. fgets(temporal,10,stdin);
  8. temporal[strcspn(temporal,"\n\r")] = '\0';
  9. printf("Valor leido %s\n",temporal);
  10. if(feof(stdin)) {
  11. printf("stdin llego al final del archivo\n");
  12. }
  13. else {
  14. printf("stdin NO llego al final del archivo\n");
  15. }
  16. }
  17.  

El problema de todo esto radica que cuando estamos leyendo multiples valores desde el teclado, aun que lo delimitemos con fgets para la cantidad de datos que se guardaran en cada variable, el fgets , al igual que otras funciones de entrada deja los caracteres restantes en el buffer de entrada y son tomados automaticamnete por cualquier funcion de entrada de texto.




Como ven en la imagen, en la segunda entrada de las AAAAAAAAAAAAA, se salto el segundo "Ingrese una cadena."

Código:
#include<stdio.h>
#include<string.h>

int main() {
char temporal_1[10];
char temporal_2[10];
printf("Ingrese una cadena: ");
fgets(temporal_1,10,stdin);
temporal_1[strcspn(temporal_1,"\n\r")] = '\0';
printf("Ingrese una cadena: ");
fgets(temporal_2,10,stdin);
temporal_2[strcspn(temporal_2,"\n\r")] = '\0';
printf("Valor leido %s\n",temporal_1);
printf("Valor leido %s\n",temporal_2);
}

Este problema tambien se presenta en C++ con funciones de entrada tipo cin>>

Ejemplo:



Codigo:

Código
  1. #include<iostream>
  2.  
  3. using namespace std;
  4. int main() {
  5. int numero_1,numero_2;
  6. cout<<"Ingrese un numero: ";
  7. cin>>numero_1;
  8. cout<<"Ingrese un numero: ";
  9. cin>>numero_2;
  10. cout<<"Valor leido "<<numero_1<<endl;
  11. cout<<"Valor leido "<<numero_2<<endl;
  12. }
  13.  

Entonces pregunto:

¿Cual es la solución para limpiar el buffer de entrada, si es que realmente queda algo en el?
¿Como se si es que realmente queda algo en el buffer de entrada, sin consumirlo.?



https://albertobsd.blogspot.com/2018/11/queda-algo-en-el-buffer-de-entrada-stdin.html
484  Programación / Programación C/C++ / Re: ¿Por qué no va este código? en: 24 Noviembre 2018, 18:03 pm
Seguramente es por que la variable Suma, solo se inicializa antes del ciclo, y no dentro de el mismo.

Asi en la segunda vuelta su valor ya no es  0 antes de hacer cualquier calculo.

saludos!
485  Seguridad Informática / Criptografía / Re: Obtener datos de un archivo PKCS12 del cual no conocemos la contraseña en: 24 Noviembre 2018, 14:45 pm
En teoría eso datos son públicos y conociendo el formato no debe de existir problema en leerlo.

En lo personal no he trabajado con ese tipo de archivos pero debe de existir un Documento que te indique en donde se encuentra cada campo dentro del archivo.

Saludos
486  Programación / Programación C/C++ / Re: ¿Como filtrar todo tipo de datos de entrada en un programa? en: 24 Noviembre 2018, 13:47 pm
Ese tipo de filtros si sabía hacerlos, pero me gustaria hacer uno sencillo para todo carácter que no sea un número positivo. Por ejemplo, imagina que el usuario introduce una arroba, un guión o un símbolo de dollar. ¿Si se pudiese hacer de manera sencilla como lo haria?

Lo que aimnotabot necesita es otro lenguaje de programación. Que tenga una funcion magica que sea inteligente y pasa de precedir cualquier input......, O espera esto es C y C++ puedes programar una funcion que haga cualquier cosa!!!!

Puedes usar todas las respuestas que ya te dieron y meterlas en una funcion creada por ti que se adapte a tus necesidades.

Realmente el C basico no hay manera facil de hacerlo, tal vez con C++ y varias de sus funciones como las que te mencionan de regex en el primero reply, podrías lograr algo mas sencillo, pero si seria de investigar un poco mas ya que hay muchas funciones "nuevas" que no conozco de C++.

Tu mejor opción sería emplear expresiones regulares (regex).

Puedes consultar la siguiente fuente donde viene bastante información...


El mejor de los casos que seria programar una función que haga lo que quieres de una forma que tu comprendas.

Código
  1. int i;
  2. i = funcion_leer("Ingrese un numero positivo\n",CONSTANTE_PARA_POSITIVOS);
  3.  

Y por otro lado tendrias.

Código
  1. int funcion_leer(char *s,int tipo) {
  2. int valor;
  3. int entrar_1 = 1;
  4. int entrar_2 = 1;
  5. char temporal[50];
  6. char *ptr;
  7. do {
  8. entrar_2 = 1;
  9. do{
  10. printf(s);
  11. fgets(temporal,50,stdin);
  12. fflush(stdin);
  13. valor = strtol(temporal,&ptr,10);
  14. switch(ptr[0]) {
  15. case '\n':
  16. case '\r': //No recuardo cual de los 2 es el bueno, esto depende del sistema operativo segun recuerdo, favor de corregirme si estoy en un error
  17. case '\0':
  18. entrar_2 = 0; //Salimos por que la cadena no tiene caracteres extraños
  19. break;
  20. default:
  21. break;
  22. }
  23. }while(entrar_2);//De aqui no salimos hasta que strtol confirme que no tenemos ningun caracter raro, esto es cuando ptr apunte solo a '\r' o '\n' o '\0';
  24. switch(tipo){ //Ahora evaluamos que el dato sea lo que buscamos
  25. case NUMERO_ENTERO: //Cualquier Numero
  26. entrar_1 = 0;
  27. break;
  28. case NUMERO_NATURAL: // > 0
  29. if(valor > 0) {
  30. entrar_1 = 0;
  31. }
  32. break;
  33. case NUMERO_NEGATIVO:
  34. if(valor < 0) {
  35. entrar_1 = 0;
  36. }
  37. break;
  38. case NUMERO_PAR:
  39. if(valor %2 == 0) {
  40. entrar_1 = 0;
  41. }
  42.  
  43. break;
  44. case NUMERO_IMPAR:
  45. if(valor % 2 == 1) {
  46. entrar_1 = 0;
  47. }
  48. break;
  49. //etc...
  50. }
  51. }while(entrar_1);
  52. return valor;
  53. }
  54.  

Obviamente tienes que tener declaradas X cantidad de constantes, no es algo tan sencilla la funcion completa, pero es lo mejor validado que podrás encontrar.

Aqui esta el ejemplo de salida.




Saludos
487  Programación / Bases de Datos / Re: Defina el termino relacion en: 24 Noviembre 2018, 13:41 pm
Si lo quieres ver de esa manera es algo asi. La tupla seria seria como una lista ligada de registros que son elementos de un struct, los valores serian los campos de dicho struct. Y las relaciones entre ellos si es que las hay serian... no se un valor o campo "Genero" de una tupla  llamada "Empleado" que tenga posibles valores de uno y dos, uno para Femenino y dos para Masculino. Entonces existe una Tupla llamada Genero que contiene los valores antes mencionados.

Nos podriamos poner mas estrictos y realizar una tupla para campo una para puros nombres, una para puros apeidos, una para nombres de puestos de trabajo. Etc... y al final cada una de estas tendria una relacion con la Tupla de Empleados, la cual solo terminaria guardando puros numeros que indicarian el index del registro en las otras tuplas
488  Programación / Bases de Datos / Re: Defina el termino relacion en: 24 Noviembre 2018, 08:20 am
Hola

Es la teoria del Modelo relacional de las Bases de Datos, en lenguaje matematico.

https://es.m.wikipedia.org/wiki/Modelo_relacional
https://es.m.wikipedia.org/wiki/Tupla

Imaginate a las Tuplas como Tablas y los Valores como los campos de dicha tabla.

Ahora hay un conjunto de Relaciones entre las tablas. A1 A2 ...

Al decir de un Ejemplo o formalice un Esquema de relacion puedes Dar un ejemplo de una base de datos con N tablas y como se relacionan entre ellas.

Saludos, No tienes algun texto de bases de datos como Guia?
489  Programación / Programación C/C++ / Re: ¿Como filtrar todo tipo de datos de entrada en un programa? en: 24 Noviembre 2018, 05:02 am
La forma correcta de realizar esto es procesar todo como texto o cadena de carectares al momento de la entrada y procesar los tipos de datos directamente con las funciones apropias como strtol o strtof

Codigo para C

Código
  1. int dato_entero;
  2. float dato_flotante;
  3. char temp[10];
  4. //Capturamos variable_entera
  5. do {
  6. printf("Capture variable_entera: ");
  7. fgets(temp,10,stdin);
  8. dato_entero= strtol(temp,NULL,10); //Solo procesamos numeros BASE 10
  9.  
  10. /*En la funcion anterior se pude cambiar el NULL, por un apuntador y asi deteminar en que momento se para la funcion strtol, si el apuntador Apunta, a un '\n' significa que leyo hasta un Enter, si apunta a alguna letra o simbolo significa que trataron de ingresar caracteres distintos a los esperados*/
  11.  
  12. }while(dato_entero >= 0); // Salimos del DO solo si el valor leido es negativo
  13.  
  14.  
  15. do {
  16. printf("Capture variable_flotante: ");
  17. fgets(temp,10,stdin);
  18. dato_flotante= strtof(temp,NULL);
  19.  
  20. /*En la funcion anterior se pude cambiar el NULL, por un apuntador y asi deteminar en que momento se para la funcion strtol, si el apuntador Apunta, a un '\n' significa que leyo hasta un Enter, si apunta a alguna letra o simbolo significa que trataron de ingresar caracteres distintos a los esperados*/
  21.  
  22.  
  23.  
  24. }while(dato_flotante == 0.0); // Salimos del DO solo si el valor leido distinto de 0
  25.  

Para C++ deben de existir formas diferentes de procesarlos datos
490  Programación / Programación C/C++ / Re: Cargar archivo binario(No lee los caracteres de la cadena) en: 24 Noviembre 2018, 00:28 am
No te deja hacer el delete directamente?

Código:
delete(temp);

Y como comentario no existe tal cosa como LENGUAJE VISUAL STUDIOS 2017 C++.
Es C o C++.
Ya aparte mencionar el IDE en este caso se entiende que es Visual Studio.

Saludos!
Páginas: 1 ... 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 [49] 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 ... 235
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines