i; 库特,c++,iostream,C++,Iostream" /> i; 库特,c++,iostream,C++,Iostream" />

istream::ignore和getline()混淆 我帮助C++输入的人,虽然我自己不知道C++。下面是一个简短的例子: #include <iostream> #include <string> using namespace std; int main() { int i; string s; cout << "enter i:\n"; cin >> i; cout << "enter s:\n"; getline(cin, s); //cin.ignore(100, '\n'); cout << "i: " << i << ", s: " << s << "\n"; } #包括 #包括 使用名称空间std; int main(){ int i; 字符串s; cout>i; 库特

istream::ignore和getline()混淆 我帮助C++输入的人,虽然我自己不知道C++。下面是一个简短的例子: #include <iostream> #include <string> using namespace std; int main() { int i; string s; cout << "enter i:\n"; cin >> i; cout << "enter s:\n"; getline(cin, s); //cin.ignore(100, '\n'); cout << "i: " << i << ", s: " << s << "\n"; } #包括 #包括 使用名称空间std; int main(){ int i; 字符串s; cout>i; 库特,c++,iostream,C++,Iostream,我发现奇怪的是,如果取消对cin.ignore()调用的注释,则 getline()调用将提示用户输入 不,它不会。是ignore语句在提示用户。正如您所看到的,它所做的基本上与getline相同,只是它最多只能读取100个字符,并且会将它们丢弃 我发现奇怪的是,如果取消对cin.ignore()调用的注释,则 getline()调用将提示用户输入 不,不会。提示用户的是ignore语句。正如您所看到的,它所做的基本上与getline相同,只是它最多只能读取100个字符,并且会将它们丢弃。嗯,不

我发现奇怪的是,如果取消对cin.ignore()调用的注释,则 getline()调用将提示用户输入

不,它不会。是ignore语句在提示用户。正如您所看到的,它所做的基本上与getline相同,只是它最多只能读取100个字符,并且会将它们丢弃

我发现奇怪的是,如果取消对cin.ignore()调用的注释,则 getline()调用将提示用户输入


不,不会。提示用户的是ignore语句。正如您所看到的,它所做的基本上与getline相同,只是它最多只能读取100个字符,并且会将它们丢弃。

嗯,不。不是“
getline()
会提示用户输入”。显然,
ignore
语句在
getline()之后

发生的情况是,
ignore()
语句只是阻塞,直到完成它的任务,即吞掉100个字符或换行符,以先到者为准(但请注意输入缓冲)


作为一个通则,虽然不是直接相关的,但是建议:不要混合令牌提取(<代码> > >代码>)和<代码> GETLILE()/<代码>,确切地说是关于新行的问题。最好是坚持一件事;最好是行读,这样你就可以处理错误并重复提示。也可以考虑任何未检查的读操作。(

>
getline()
,或
istream::read()
)编程错误;所有这些都应该有条件。

哦,不。不是“
getline()
会提示用户输入”。显然,
ignore
语句出现在
getline()
语句之后

发生的情况是,
ignore()
语句只是阻塞,直到完成它的任务,即吞掉100个字符或换行符,以先到者为准(但请注意输入缓冲)


作为一个通则,虽然不是直接相关的,但是建议:不要混合令牌提取(<代码> > >代码>)和<代码> GETLILE()/<代码>,确切地说是关于新行的问题。最好是坚持一件事;最好是行读,这样你就可以处理错误并重复提示。也可以考虑任何未检查的读操作。(

>
getline()
istream::read()
)编程错误;所有这些都应该有条件。

等待输入的不是
getline
调用,而是
忽略
忽略的调用


ignore
调用放在
getline

之前,等待输入的不是
getline
调用,而是等待忽略的
ignore
调用


ignore
调用放在
getline

之前,谢谢。我认为
istream::ignore()
是“非侵入性”的,如果没有什么可以忽略的,就直接跳过。你为什么会这样想?检查“提取字符”。它没有说明任何可选内容。也许
readsome()
可以用来实现一些前瞻性检查……但正如我在上一段中所说,这样做很少有用。是的,现在一切都有意义了。不知何故,我在浏览手册时错过了这个细节。谢谢。我认为
istream::ignore()
是“非侵入性的”如果没有什么可忽略的,就直接跳过。你为什么会这样想?检查“提取字符”。它没有说明任何可选内容。可能
readsome()
可以用来实现一些前瞻性检查……但正如我在上一段中所说,这样做很少有用。是的,现在一切都有意义了。不知何故,我在浏览手册时错过了这个细节。