getline不要求输入吗?
getline不要求输入吗?
这可能是一个非常简单的问题,但请原谅我,因为我是新手。
这是我的代码:
#include
#include
#include
using namespace std;
int main ()
{
string name;
int i;
string mystr;
float price = 0;
cout << "Hello World!" << endl;
cout << "What is your name? ";
cin >> name;
cout << "Hello " << name << endl;
cout << "How old are you? ";
cin >> i;
cout << "Wow " << i << endl;
cout << "How much is that jacket? ";
getline (cin,mystr);
stringstream(mystr) >> price;
cout << price << endl;
system("pause");
return 0;
}
问题是,当询问“那件夹克多少钱?”时,getline不会要求用户输入,而只是输入初始值“0”。为什么会这样?
问题的原因是之前的输入操作留下了一个'\n'字符在输入流中。解决方法是在每次输入之后,确保每一行都被独立处理。具体做法是先读取一行,然后对该行进行处理。可以使用std::getline(std::cin, line)来读取一行,然后使用std::stringstream来处理该行。处理完后,可以检查是否还有多余的内容,如果有则输出错误信息。以下是示例代码:
std::string line; std::getline(std::cin, line); std::stringstream linestream(line); // 现在可以对linestream进行处理了。 std::string garbage; linestream >> i >> garbage; // 在读取数字后,可以检查是否还有多余的内容。 if (!garbage.empty()) { std::cout << "Error\n"; }
这样做可以避免使用getline时出现问题。如果不理解这个方法,可以参考给出的链接augustcouncil.com/~tgibson/tutorial/iotips.html[link],上面的内容非常有用。
在使用operator>>
和getline
混合使用时,需要小心。问题在于,当使用operator>>
时,用户输入数据后按下回车键,这会将换行符放入输入缓冲区。由于operator>>
是以空格为分隔符的,换行符不会放入变量中,而是留在输入缓冲区中。然后,当调用getline
时,它只会寻找换行符。由于换行符是缓冲区中的第一个内容,getline
会立即找到需要的内容,而不需要提示用户。
解决方法:
如果在使用operator>>
后要调用getline
,需要在两者之间调用ignore函数,或者做其他操作来清除换行符,比如虚拟调用getline
。
另一个选择是完全不使用operator>>
,只使用getline
,然后将字符串转换为所需的数据类型。这样做的副作用是使代码更安全和健壮。首先编写如下函数:
int getInt(std::istream & is) { std::string input; std::getline(is,input); // C++11 version return stoi(input); // 失败时抛出异常 // C++98 version /* std::istringstream iss(input); int i; if (!(iss >> i)) { // 处理错误 } return i; */ }
你可以为浮点数、双精度数和其他类型创建类似的函数。然后,在需要整数时,不再使用cin >> i;
,而是使用i = getInt(cin);
来替代。
谢谢Benjamin!我完全理解你的意思。
为什么我没有早点加入这个网站呢 :-/
“return stoi(input)”的意思是返回stoi(input)的返回值吗?
不是。它的意思是“返回stoi(input)的返回值”。stoi接受一个字符串(这里没有if语句,它必须是一个字符串,否则无法编译),并尝试将其转换为整数。
问题的出现原因是因为使用了cin.ignore(256, '\n'),这行代码的作用是忽略输入流中的字符直到遇到换行符为止。接下来使用了getline(cin, mystr)来获取输入的字符串。
对于第一个问题,为什么要忽略256个字符,不是一个字节吗?实际上,这里的256是最大要提取或忽略的字符数。根据输入的长度,你可以有一个大于256的数字。在这个例子中,我假设256是输入字符的最大长度,用于name字符串。
解决这个问题的方法是根据实际情况调整cin.ignore()和getline()的参数。根据输入的长度,你可以选择忽略更多的字符或提取更多的字符。
下面是整理后的文章:
在使用getline函数时,有时会遇到getline not asking for input的问题。这个问题的出现原因是因为在使用getline函数之前使用了cin.ignore(256, '\n')代码。
cin.ignore(256, '\n')的作用是忽略输入流中的字符直到遇到换行符为止。这样做的目的是清除之前输入流中的缓存,以防止对后续的输入造成干扰。
然而,在某些情况下,这行代码可能会导致getline函数不再等待用户输入。原因是参数256的设置有可能超过了实际输入字符的长度。
解决这个问题的方法是根据实际情况调整cin.ignore()和getline()的参数。根据输入的长度,你可以选择忽略更多的字符或提取更多的字符。通过调整参数,可以确保getline函数能够正常等待用户输入。
总之,通过调整cin.ignore()和getline()的参数,可以解决getline not asking for input的问题。这样可以确保程序正常等待用户输入,并正确获取输入的字符串。