首页 文章

使用cin.getline()后清除cin缓冲区时的问题

提问于
浏览
2

我使用getline(cin.getline()one)从cin获取字符串并查找特殊情况的问题 . 如果用户输入的字符数多于streamsize参数(在本例中为50),则cin缓冲区会保存它们并将它们放入下一个cin调用中 . 如果我使用cin.clear()和cin.ignore()并且用户输入的字符数少于streamsize参数,则程序会等待用户在继续之前再次按Enter键 . 所以我使用strlen来检查字符串的大小,如果字符串有50个字符,则只使用cin.clear()和cin.ignore() . 这会删除用户在第49个字符后输入的额外字符 . 问题是,当用户输入正好49个字符时,缓冲区中没有额外的字符可以通过cin.clear()和cin.ignore()调用来切断,因此程序将等待用户进入按另一次输入 .

几个问题:

1)是否有一个标志我可以检查缓冲区中是否有字符,所以只有当这个标志为真时我才能清除()和忽略()?

2)还有其他方法我可以调用同一个getline函数来切断streamsize参数后的所有字符吗?

这是我的代码:

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

#define SIZE 50

void getString(char*);

int main() {
    char words[SIZE];
    getString(words);
    return 0;
}

void getString(char* words) {
    cout << "Enter your string: ";
    cin.getline(words, SIZE);
    if (strlen(words) == SIZE - 1) {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
}

导致问题的示例49字符输入:

abcdefghijklmnopqrstuvwxysabcdefghijklmnopqrstuvw

删除或添加一个字母以查看该程序的正常性能 .

1 回答

  • 1

    您可以使用 istream::gcount() 来判断行中是否还有除 '\n' 以外的其他字符 .

    以下是您需要考虑的案例 .

    • cin.gcount() 的返回值小于 SIZE-1 . 在这种情况下,线上没有任何东西 . 您不必担心忽略其余部分 .

    • cin.gcount() 的返回值为 SIZE-1 . 这可能是由于两种情况 .

    • 用户输入 SIZE-2 个字符后跟换行符 . 在这种情况下,线上没有任何东西 . 您不必担心忽略其余部分 .

    • 用户输入 SIZE 或更多字符后跟换行符 . 在这种情况下,行中仍然有一些字符 . 您将要忽略该行的其余部分 .

    • cin.gcount() 的返回值是 SIZE . 仅当用户输入 SIZE-1 字符后跟换行符时才会发生这种情况 . 该行中的所有字符都被读入提供给该函数的参数中 . 读取并丢弃换行符 . 您不必担心忽略其余部分 .

    给出上述情况,只有当你遇到案例2.2时,你唯一需要担心忽略其余部分 . cin.gcount() == SIZE-1strlen(words) == SIZE-1 符合条件 .

    void getString(char* words) {
        cout << "Enter your string: ";
        cin.getline(words, SIZE);
        if (cin.gcount() == SIZE-1 && strlen(words) == SIZE-1)
        {
            // There are characters in the stream before the \n.
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
    }
    

相关问题