📜  cin之后getline()的问题>>(1)

📅  最后修改于: 2023-12-03 14:59:56.009000             🧑  作者: Mango

cin之后getline()的问题

介绍

在C++编程中,很多程序员会遇到输入字符串时出现问题,特别是在使用cin和getline()一起使用的情况下。cin和getline()都是用于从输入流中读取数据的函数,两个函数在读取数据时有所不同,这种不同性质可以导致字符串缓存区的问题。

cin 输入函数

c++中的cin输入函数是一个比较常用的函数,用于将用户输入的数据接收到程序中来,可以通过cin向控制台(标准输出stdout)输出字符串。当你用cin读取一个值时,它会读取输入缓存区中的数据,同时忽略输入缓存中的空格、换行和制表符,将输入的数据存储在变量中。

例如,下面是一个使用cin函数读取用户输入的代码段:

#include <iostream>
using namespace std;

int main()
{
    int age;
    cout << "Enter your age: ";
    cin >> age;

    cout << "Your age is: " << age << endl;
    return 0;
}

上面的程序中,cin函数将读取age的值并将其存储在变量age中。

getline()函数

getline()函数是C++ STL库定义的一个输入函数,它可以接收从键盘或文件中的输入流中读取输入的文本,并存储在指定的字符串变量中。与cin不同,在getline()中,输入缓存区中的空格、制表符和回车都会被读取并存储在指定的字符串变量中。这意味着getline()可以读取完整的行,而不仅仅是行的一部分。

下面是一个使用getline()读取用户输入的代码片段:

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

int main()
{
    string name;
    cout << "What is your name? ";
    getline(cin, name);

    cout << "Hello, " << name << endl;
    return 0;
}

getline()函数的语法格式如下:

std::getline(istream &is, string &str, char delim = '\n');

其中,is表示输入流,str表示指定的字符串变量,delim表示输入流的定界符。如果未指定定界符,则默认为换行符'\n'

cin与getline()同时使用的问题

当我们在一个程序中同时使用cin和getline()时,我们可能会遇到一些问题,尤其是在我们想读取完整行的情况下。getline()会读取上一个cin输入函数残留在输入缓存区中的字符,而不是等待一个新的用户输入。

下面是一个使用cin和getline()读取用户输入时可能出现问题的代码片段:

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

int main()
{
    string name;
    int age;
    cout << "What is your name? ";
    getline(cin, name);

    cout << "Enter your age: ";
    cin >> age;

    cout << "Hello, " << name << ". You are " << age << " years old." << endl;
    return 0;
}

上面的程序中,当我们使用getline()读取name时,它会读取cin留下的残留字符,导致我们输入的名字字符串不完整。

为了解决这个问题,我们可以使用cin.ignore()函数从输入缓存区中清除残留字符,如下所示:

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

int main()
{
    string name;
    int age;
    cout << "What is your name? ";
    getline(cin, name);

    cout << "Enter your age: ";
    cin >> age;

    // clear input buffer
    cin.ignore();

    cout << "Hello, " << name << ". You are " << age << " years old." << endl;
    return 0;
}

上面的代码使用cin.ignore()函数清除输入缓存区中的残留字符,以确保我们输入的字符串完整。

总结

cin和getline()是用于从输入流中读取数据的函数,在读取数据时有所不同,这种不同性质可能会导致一些问题。当你要使用cin和getline()在同一个程序中读取输入时,你需要注意输入缓冲区中的残留字符,并使用cin.ignore()函数清除它们,以确保你输入的字符串完整,并且避免输入错误。