Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - ricardo2013

#1
Es así

Código (c++) [Seleccionar]

#include <iostream>
#include <limits>

using namespace std;

int main()
{
    char nombre[10] = "";
    int dia = 0;
    cin.getline(nombre, 10, '\n');
    cin.clear();
    cin.ignore(numeric_limits<int>::max(), '\n');
    cout << "dia: ";
    cin >> dia;
    cout << "dia: " << dia << endl;

    return 0;
}


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

Un saludo
#2
Cita de: leosansan en 25 Octubre 2012, 15:16 PM
Es curioso, a mí entrando más de 10 caracteres si me funciona


[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 (c++) [Seleccionar]

#include <iostream>
#include <limits>
using namespace std;

int main()
{
   char nombre[5];
   int dia = 0;
   cin.getline(nombre, 5);
   cin.ignore(numeric_limits<int>::max(), '\n');
   if (cin.fail())
       cout << "fail\n";
   cout << nombre;
   cout << "\ndia: ";
   cin >> dia;
   cout << "el dia es " << dia << endl;
   return 0;
}



[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 (c++) [Seleccionar]

cin.clear()


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

Estoy amargado con esto  :(
#3
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 C/C++ / cin.getline y cin.ignore
25 Octubre 2012, 13:08 PM
Código (c++) [Seleccionar]

#include <iostream>
#include <limits>

using namespace std;

int main()
{
    char nombre[10] = "";
    int dia = 0;

    cin.getline(nombre, 10, '\n');
    cin.ignore(numeric_limits<int>::max(), '\n');
   
    cout << "dia: ";
    cin >> dia;
    cout << "dia: " << dia << endl;

    return 0;       
}


Compilo y ejecuto:


[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 C/C++ / Re: Matriz estática
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 (c++) [Seleccionar]

#include <iostream>
#include <cstring>
int main()
{
    const int i = strlen("prueba");
    static char cadena[i];
    return 0;
}


Un saludo

#6
Programación C/C++ / Matriz estática
24 Octubre 2012, 20:40 PM

#include <iostream>

int main()
{
    const int i = 2;
    static char cadena[i];
    return 0;
}


El error:

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 (c++) [Seleccionar]

    char *Clase::obtenerNombre(char * nombre) const {
        if (m_nombre) {
            const int len = strlen(m_nombre)+1;
            static char nom[len];
            strcpy(nom, m_nombre);
            nombre = nom;
            return nombre;
        }
    }


m_nombre es un atributo de la clase "Clase" y que está definido de la siguiente forma:
Código (c++) [Seleccionar]

char *m_nombre;


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
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
¿Por qué no me funciona esto para imprimir un float en dígitos hexadecimales?



#include <stdio.h>

int main()
{
    float f = 5.5;
    printf("%X\n", f);
    return 0;
}



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

Gracias anticipadas
#9
Programación C/C++ / EOF y sscanf (SOLUCIONADO)
11 Octubre 2012, 11:00 AM

#include <stdio.h>
#include <string.h>

int main()
{
   int dato;
   int rs;
   char linea[8];
   fgets(linea, 8, stdin);
   rs = sscanf(linea, "%d", &dato);
   printf("%d\n", rs);
   return 0;
}


¿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