当前位置: 首页 > 知识库问答 >
问题:

使用cin后清除cin缓冲区时出现问题。getline()

轩辕鸿祯
2023-03-14

我正在使用getline(cin.getline())从cin中获取一个字符串,并发现一个特殊情况的问题。如果用户输入的字符比stream size参数多(在本例中为50),cin缓冲区会保存它们并将它们放入下一个cin调用中。如果我使用cin.clear()和cin.ignore(),并且用户输入的字符比stream size参数少,那么程序会等待用户再次按Enter,然后继续运行。所以我使用strlen来检查字符串的大小,如果字符串有50个字符,则仅使用cin.clear()和cin.ignore()。这会砍掉用户在第49个字符之后输入的额外字符。问题是,当用户输入49个字符时,缓冲区中没有多余的字符可以通过cin.clear()和cin.ignore()调用来切断,因此程序将静坐等待用户下次按Enter。

几个问题:

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

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个答案

盛承
2023-03-14

您可以使用istream::gcount()来确定行中是否还有除“\n”以外的字符。

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

>

  • cin的返回值。gcount()小于SIZE-1。在这种情况下,线路上什么都没有了。你不必担心会忽略其他部分。

    cin的返回值。gcount()是SIZE-1。这可能是由于两种情况造成的。

    >

  • 用户输入大小为2的字符,后跟换行符。在这种情况下,线路上什么都没有了。你不必担心会忽略其他部分。

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

    cin的返回值。gcount()是大小。只有当用户输入大小为1的字符并后跟换行符时,才会发生这种情况。该行中的所有字符都被读入提供给函数的参数中。将读取并丢弃换行符。你不必担心会忽略其他部分。

    给出上述情况,您唯一需要担心忽略该行其余部分的时候是当您遇到案例2.2时。当cin.gcount () == SIZE-1strlen(word)==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');
        }
    }
    

  •  类似资料:
    • 所有,我这里有一些无法解释行为的代码。它贴在下面。我看了为什么整数溢出会导致C iostream的错误?,但它并没有真正回答我的问题。 因此,我希望这段代码所做的是读入一个整数,打印出该整数的值,读入另一个整数(到同一个变量中),然后打印出这个整数。如果我输入7和2,那么它将按预期工作。但是,如果我为第一个和第二个输入输入2^31(溢出整数1),则第一个输出将显示“x的值=-2147483648”

    • 我有一个使用paramiko的缓冲区的问题,我在这里发现了同样的问题,其中一个解决方案指出: 如果您只是调用.open()来获取SFTPFile实例,而不是使用.get(),那么就对该对象调用.read(),或者只是将其交给Python标准库函数shutil.copyFileObj()来下载内容。这将避免Paramiko预取缓存,并且允许您下载文件,即使它没有那么快。 如果我有:

    • 在C语言中,我们通常会使用 scanf 和 printf 来对数据进行输入输出操作。在 C++语言中,C语言的这一套输入输出库我们仍然能使用,但是 C++ 又增加了一套新的、更容易使用的输入输出库。 【例1】简单的输入输出代码示例: 运行结果如下(↙表示按下回车键): Please input an int number: 8↙ The int number is x= 8 Please inpu

    • 当我尝试运行gtfs\u realtime\u pb2时,我遇到以下错误。py(通过google的协议缓冲区运行gtfs-realtime.proto生成的python代码): 这是指向我遇到问题的特定代码的链接:https://github.com/mattwigway/gtfsrdb 以及安装谷歌协议缓冲区的链接: https://developers.google.com/protocol-

    • 问题内容: 我正在尝试使用节点child_process执行curl从本地网络中的共享文件夹中获取JSON文件(约220Ko)。但是它实际上返回了一个我无法解决的缓冲区问题。这是我的代码: 这是我得到的错误: 问题答案: 使用时,您需要使用并设置选项。从文档中: 指定在stdout或stderr上允许的最大数据量-如果超出此值,则终止子进程。 该文档还指出默认值为200KB。 例如,以下代码将最大

    • 问题内容: 我有这样的事情: 如何清除缓冲区? 编辑:我尝试了以下方法,但由于某些原因它不起作用: 问题答案: 您无法明确清除扫描仪的缓冲区。在内部,它可能会在读取令牌后清除缓冲区,但这是porgrammers无法实现的实现细节。