C++ 使用cin 和cin.get()输入字符或数字后导致cin.get(),cin.getline()无法输入

使用cin>>和cin.get()输入字符或数字,紧接着使用cin.get()或cin.getline()等函数时表现出没有执行,直接跳过的现象。

日期:2022-07-07

cin 问题示例

#include 
#include 

using namespace std;

void test_cin()
{
    // ------------char------------
    char c = 'c';
    cout << "c = " << c << endl;
    
    // cin >> c;
    cin.get(c);
    cout << "c = " << c << endl;

    char *arr = new char[5];
    //1.
    cin.getline(arr, 5);    // 此处的表现为跳过
    cout << "//1 arr =  " << arr << endl;
    // replace
    // cin.get(); // cin.ignore();

    //2.
    cin.getline(arr, 5);    // 此处正常执行
    cout << "//2 arr =  " << arr << endl;

    delete []arr;
    arr = NULL;
    return ;
}

int main(int argc, char const *argv[])
{
    test_cin();
    return 0;
}

图片.png运行代码后,控制台先打印 c = c , 输入a后回车,控制台打印2行:
c = a
//1 arr =
随后输入gett并回车,控制台打印:
//2 arr = gett

可见//1 出的代码似乎是跳过了

原因

cin>> 输入,遇到空格,tab,回车,换行符会结束,有时需要输入空格,则需使用函数cin.get() 或者 cin.getline();这两个函数都可以读取一行直到遇到终止符结束,终止符默认为换行符,如果显式的给出了其他终止符,则可以读取换行,空白等字符;cin.get()会把终止符保留在缓冲区中,cin.getline()则是把终止符丢弃。

cin>> 会把输入完成后点击的换行符也会保留在缓冲区中。

如果不清空缓冲区,则下次输入时可能会发生错误。

解决

可使用cin.get()(没有参数)或 cin.getline 来清空缓冲区。

当cin.getline() 及 getline() 使用终止符时,换行符是可以包含在输入内的,而不会结束输入,此时终止符后面的换行符或者更多的字符不会被读取,而是被保留在缓冲区内,此时也需要清空缓冲区,避免影响下一次输入;需要注意的是,cin.get()只能读取一个字符,如果缓冲区内有多个字符则需要使用cin.getline()将缓冲区内的字符读到一个大容量的字符数组内来达到清空缓冲区的目的。

int main(int argc, char const *argv[])
{
    char arr[5];
    cin.getline(arr, 5, 'g');
    cout<<"arr: "<<arr<<endl;

    char flush_clear[100];
    cin.getline(flush_clear, 100);
    cout<<"flush_clear="<<flush_clear<<endl;
    return 0;
}

图片.png输入a换行,再输入bg21435678089换行,控制台连续打印以下3行
arr: a
b
flush_clear=21435678098

该示例中的cin.getline函数使用了终止符’g’ ,则g后面的字符军不会读如arr中,但是会保留在缓冲区中,直接被下文的cin.getline赋给了flush_clear
本应在输出arr后,再输入flushclear,但是缓冲区中的内容直接影响了flushclear的输入。

你可能感兴趣的:(CPP,c++)