getline no pide entrada?

Este es probablemente un problema muy simple, pero perdóname ya que soy nuevo. Aquí está mi código:

#include  #include  #include  using namespace std; int main () { string name; int i; string mystr; float price = 0; cout << "Hello World!" << endl; cout <> name; cout << "Hello " << name << endl; cout <> i; cout << "Wow " << i << endl; cout <> price; cout << price << endl; system("pause"); return 0; } 

El problema es que cuando se le pregunta how much is that jacket? getline no solicita la entrada al usuario y simplemente ingresa el valor inicial de “0”. ¿Por qué es esto?

Debe tener cuidado al mezclar el operator>> con getline . El problema es que cuando usa el operator>> , el usuario ingresa sus datos, luego presiona la tecla Intro, que pone un carácter de nueva línea en el búfer de entrada. Dado que el operator>> está delimitado por espacios en blanco, el carácter de nueva línea no se coloca en la variable y permanece en el búfer de entrada. Luego, cuando llamas a getline , lo único que buscas es un carácter de nueva línea. Como eso es lo primero en el búfer, encuentra lo que está buscando de inmediato y nunca necesita avisarle al usuario.

Solución: si va a llamar a getline después de usar el operator>> , llame ignore en el medio, o haga algo más para deshacerse de ese carácter de línea nueva, tal vez una llamada ficticia a getline .

Otra opción, y esta es la línea de lo que Martin estaba hablando, es no usar el operator>> en absoluto, y solo usar getline , luego convierta sus cadenas a cualquier tipo de datos que necesite. Esto tiene un efecto secundario de hacer que su código sea más seguro y robusto. Primero escribiría una función como esta:

 int getInt(std::istream & is) { std::string input; std::getline(is,input); // C++11 version return stoi(input); // throws on failure // C++98 version /* std::istringstream iss(input); int i; if (!(iss >> i)) { // handle error somehow } return i; */ } 

Puede crear una función similar para flotantes, dobles y otras cosas. Entonces cuando necesitas en int, en lugar de esto:

 cin >> i; 

Tu hiciste esto:

 i = getInt(cin); 

Ignore algunos caracteres hasta que se llegue al avance de línea.

 cin.ignore(256, '\n') getline (cin,mystr); 

Es porque tiene una '\n' izquierda en el flujo de entrada de una llamada anterior.

 cin >> i; // This reads the number but the '\n' you hit after the number // is still on the input. 

La manera más fácil de hacer una entrada interactiva de usuario es asegurarse de que cada línea se procese de manera independiente (ya que el usuario presionará Enter luego de cada aviso).

Como resultado, siempre lea una línea, luego procese la línea (hasta que se familiarice con las transmisiones).

 std::string line; std::getline(std::cin, line); std::stringstream linestream(line); // Now processes linestream. std::string garbage; lienstream >> i >> garbage; // You may want to check for garbage after the number. if (!garbage.empty()) { std::cout < < "Error\n"; }