gpt4 book ai didi

c++ - 使用 cin.getline() 后清除 cin 缓冲区时出现问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:05:26 25 4
gpt4 key购买 nike

我正在使用 getline(cin.getline() 之一)从 cin 获取一个字符串并发现一个特殊情况的问题。如果用户输入的字符多于 streamsize 参数(在本例中为 50),则 cin 缓冲区会保留它们并将它们放入下一个 cin 调用中。如果我使用 cin.clear() 和 cin.ignore() 并且用户输入的字符少于 streamsize 参数,那么程序会等待用户再次按下回车键,然后再继续。所以我使用 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

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

最佳答案

您可以使用 istream::gcount() 来决定是否还有除 '\n' 之外的字符留在该行中。

以下是您需要考虑的情况。

  1. cin.gcount() 的返回值小于SIZE-1。在这种情况下,该行中没有任何内容。您不必担心会忽略该行的其余部分。

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

    1. 用户输入 SIZE-2 个字符后跟一个换行符。在这种情况下,该行中没有任何内容。您不必担心会忽略该行的其余部分。

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

  3. 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');
}
}

关于c++ - 使用 cin.getline() 后清除 cin 缓冲区时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51216733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com