getline不要求输入吗?

12 浏览
0 Comments

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”。为什么会这样?

0
0 Comments

问题的原因是之前的输入操作留下了一个'\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],上面的内容非常有用。

0
0 Comments

在使用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语句,它必须是一个字符串,否则无法编译),并尝试将其转换为整数。

0
0 Comments

问题的出现原因是因为使用了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的问题。这样可以确保程序正常等待用户输入,并正确获取输入的字符串。

0