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; 库特
我发现奇怪的是,如果取消对cin.ignore()调用的注释,则 getline()调用将提示用户输入 不,它不会。是ignore语句在提示用户。正如您所看到的,它所做的基本上与getline相同,只是它最多只能读取100个字符,并且会将它们丢弃 我发现奇怪的是,如果取消对cin.ignore()调用的注释,则 getline()调用将提示用户输入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个字符,并且会将它们丢弃。嗯,不
不,不会。提示用户的是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()
可以用来实现一些前瞻性检查……但正如我在上一段中所说,这样做很少有用。是的,现在一切都有意义了。不知何故,我在浏览手册时错过了这个细节。