我正在使用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
擦除或添加一个字母以查看程序的正常性能。
您可以使用istream::gcount()来确定行中是否还有除“\n”以外的字符。
以下是您需要考虑的案例。
>
cin的返回值。gcount()小于SIZE-1。在这种情况下,线路上什么都没有了。你不必担心会忽略其他部分。
cin的返回值。gcount()是SIZE-1。这可能是由于两种情况造成的。
>
用户输入大小为2的字符,后跟换行符。在这种情况下,线路上什么都没有了。你不必担心会忽略其他部分。
用户输入SIZE
或更多字符,后跟换行符。在这种情况下,该行中仍有一些字符。您将希望忽略该行的其余部分。
cin的返回值。gcount()是大小。只有当用户输入大小为1的字符并后跟换行符时,才会发生这种情况。该行中的所有字符都被读入提供给函数的参数中。将读取并丢弃换行符。你不必担心会忽略其他部分。
给出上述情况,您唯一需要担心忽略该行其余部分的时候是当您遇到案例2.2时。当cin.gcount () == SIZE-1
和strlen(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无法实现的实现细节。