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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Re: cin.getline y cin.ignore en: 25 Octubre 2012, 15:52 pm
Es así

Código
  1. #include <iostream>
  2. #include <limits>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.    char nombre[10] = "";
  9.    int dia = 0;
  10.    cin.getline(nombre, 10, '\n');
  11.    cin.clear();
  12.    cin.ignore(numeric_limits<int>::max(), '\n');
  13.    cout << "dia: ";
  14.    cin >> dia;
  15.    cout << "dia: " << dia << endl;
  16.  
  17.    return 0;
  18. }
  19.  

Primero se desactivan los indicadores de error y después se limpia el buffer con cin.ignore.

Un saludo
2  Programación / Programación C/C++ / Re: cin.getline y cin.ignore en: 25 Octubre 2012, 15:26 pm
Es curioso, a mí entrando más de 10 caracteres si me funciona

Código:
[tmp]$ ./test
hola esto es una prueba
dia: 2
dia: 0

Fijate que sigue impriendo 0, el valor que tiene día por defecto.


Yo sigo leyendo y buscando... si cin.getline llega al número máximo de carácteres sin encontrar el delimitador, activa el flag failbit.


Código
  1. #include <iostream>
  2. #include <limits>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.    char nombre[5];
  8.    int dia = 0;
  9.    cin.getline(nombre, 5);
  10.    cin.ignore(numeric_limits<int>::max(), '\n');
  11.    if (cin.fail())
  12.        cout << "fail\n";
  13.    cout << nombre;
  14.    cout << "\ndia: ";
  15.    cin >> dia;
  16.    cout << "el dia es " << dia << endl;
  17.    return 0;
  18. }
  19.  

Código:
[tmp]$ ./dd
hola esto es una prueba
fail
hola
dia: el dia es 0

Fijaros como imprime fail.

He introducido esta línea antes del if(cin.fail())
Código
  1. cin.clear()
  2.  

Ahora NO imprime el fail pero sigue sin funcionar, el cin no lee nada.

Estoy amargado con esto  :(
3  Programación / Programación C/C++ / Re: cin.getline y cin.ignore en: 25 Octubre 2012, 14:33 pm
Gracias leosansan, pero no soluciona el problema (lo he probado). Según entiendo, cin.getline debería de "eliminar" los datos sobrantes del buffer, pero parece que no funciona. Lo curioso es que el valor que le da a dia es el que tiene por defecto, y no uno cualquier obtenido del buffer. Es como si cin no se ejecutase.

¿A alguien se le ocurre donde puede estar el error?
4  Programación / Programación C/C++ / cin.getline y cin.ignore en: 25 Octubre 2012, 13:08 pm
Código
  1. #include <iostream>
  2. #include <limits>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.    char nombre[10] = "";
  9.    int dia = 0;
  10.  
  11.    cin.getline(nombre, 10, '\n');
  12.    cin.ignore(numeric_limits<int>::max(), '\n');
  13.  
  14.    cout << "dia: ";
  15.    cin >> dia;
  16.    cout << "dia: " << dia << endl;
  17.  
  18.    return 0;      
  19. }
  20.  

Compilo y ejecuto:

Código:
[tmp]$ g++ a1.cpp -Wall -g -o a1
[tmp]$ ./a1
hola esto es una prueba con una cadena que ocupa mas de 10 caracteres
dia: dia: 0
[tmp]$

¿Por qué no me pide por pantalla el valor de día?

Gracias de antemano
5  Programación / Programación C/C++ / Re: Matriz estática en: 25 Octubre 2012, 00:05 am
Muchas gracias a los dos por la ayuda.

ya he visto el error, me he hecho un lío espantoso,  el problema está que no puedo usar strlen para iniciar el array estático, ya que el tamaño se calcula en tiempo de ejecución (strlen) y hay que fijarlo  en tiempo de compilación, de ahí que precise una constante.

NeoB, el hacerlo static es para no tener que usar new y memoria dinámica, ya que si lo utilizo, fuera del método hay que usar delete explícitamente.

Hay un error en mi primer post, era así el código que compile:
Código
  1. #include <iostream>
  2. #include <cstring>
  3. int main()
  4. {
  5.    const int i = strlen("prueba");
  6.    static char cadena[i];
  7.    return 0;
  8. }
  9.  

Un saludo

6  Programación / Programación C/C++ / Matriz estática en: 24 Octubre 2012, 20:40 pm
Código
  1. #include <iostream>
  2.  
  3. int main()
  4. {
  5.    const int i = 2;
  6.    static char cadena[i];
  7.    return 0;
  8. }
  9.  

El error:
Código:
error: storage size of ‘cadena’ isn’t constant

¿Por qué me da este error? Sin embargo si quito el static, no da error.

El motivo de querer que sea static es para hacer algo similar a esto:

Código
  1.    char *Clase::obtenerNombre(char * nombre) const {
  2.        if (m_nombre) {
  3.            const int len = strlen(m_nombre)+1;
  4.            static char nom[len];
  5.            strcpy(nom, m_nombre);
  6.            nombre = nom;
  7.            return nombre;
  8.        }
  9.    }
  10.  

m_nombre es un atributo de la clase "Clase" y que está definido de la siguiente forma:
Código
  1. char *m_nombre;
  2.  

Defino el array nom estático, para que el usuario de la clase no tenga que preocuparse de liberar memoría con delete. Estoy obligado a usar char * y no std::string.

Gracias de antemano
7  Programación / Programación C/C++ / Visual Studio 2012 - Editor de código en: 13 Octubre 2012, 19:28 pm
Hay algo que me desquicia en VS, quizás alguien que haya trasteado pueda ayudarme. Estoy acostumbrado a editores como vim, en el que me muevo muy fácilmente por el código con atajos del teclado, por ejemplo: avanzar palabras, eliminar una palabra hacia atrás  o hacia adelante, ir al final de la línea, etc...
Se puede configurar esto en VS2012?

Gracias de antemano
8  Programación / Programación C/C++ / Imprimir float en hexadecimal en: 11 Octubre 2012, 20:01 pm
¿Por qué no me funciona esto para imprimir un float en dígitos hexadecimales?

Código
  1.  
  2. #include <stdio.h>
  3.  
  4. int main()
  5. {
  6.    float f = 5.5;
  7.    printf("%X\n", f);
  8.    return 0;
  9. }
  10.  
  11.  

Debería de salir (códificación IEEE 754): 80 B0 00 00
y da: DAC98408

Gracias anticipadas
9  Programación / Programación C/C++ / EOF y sscanf (SOLUCIONADO) en: 11 Octubre 2012, 11:00 am
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6.    int dato;
  7.    int rs;
  8.    char linea[8];
  9.    fgets(linea, 8, stdin);
  10.    rs = sscanf(linea, "%d", &dato);
  11.    printf("%d\n", rs);
  12.    return 0;
  13. }
  14.  

¿Por qué al introducir Ctrl+d (EOF) no imprime -1?

Al final encontré el problema, había que iniciar linea a '\0'

Gracias de antemano
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines