gpt4 book ai didi

c++ - std::getline() 在从流中读取格式化输入后读取错误数据

转载 作者:太空狗 更新时间:2023-10-29 21:01:24 29 4
gpt4 key购买 nike

我看了其他一些问题,我对 C++ 太陌生了,不知道它们是否适用于我这里的问题。

基本上当显示“name”的输出时,如果我输入我的全名它只显示第二个词。以前,它甚至根本不接受任何东西,只是跳过它。我现在对一些看似简单的事情感到困惑。谢谢。

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

int main()
{
double money;
string name;
int age;

// Prompt for age and receive
cout<<"How old are you? ";
cin >> age;

// Prompt for money and receive
cout<<"How much money do you have?";
cin >> money >> endl;

// Prompt for name and receive
cout<<"What's your name?\n\n"<< endl;
getline(cin, name);

// Display all information to user
cout<<"Hello, "<< name <<".";
cout << "You are " << age << " years old";
cout<< " and have $" << money << ".\n";

system("PAUSE");
return 0;
}

最佳答案

问题是使用 >>> 的格式化输入读取一个值并在该值被完全解析后停止。例如,一旦出现不符合格式的内容,一个数字就完成了。也就是说,阅读会在空格或换行符(以及其他一些字符)前停止。通常这些额外的字符不会导致问题,因为在尝试读取实际值之前,格式化输入以跳过前导空格(空格、制表符、换行符等)开始。

但是,未格式化的输入,例如 getline() 会立即开始读取其值,并在遇到换行符(或如果使用三参数版本时指定为换行符的字符)时停止.也就是说,如果换行符留在流中,getline() 将在读取换行符后立即停止。

摆脱换行符(和任何其他前导空格)的最简单方法是使用 std::ws,例如:

if (std::getline(std::cin >> std::ws, name)) {
...
}

...还有,顺便说一句,每当您尝试读取某些内容时,您应该始终检查读取该值的尝试是否成功!

另一种方法是根本不使用 std::getline() 而是只使用 name 的格式化输入。但是,这是假设名称中没有任何空格。

关于c++ - std::getline() 在从流中读取格式化输入后读取错误数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18521884/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com