int _tmain(int argc, _TCHAR* argv[])
{
list<string> slst;
string str;
cout << "Enter some strings for the list:" << endl;
while(cin >> str)
slst.push_back(str);
cin.clear(); //使输入流重新处于有效状态
cout << "Enter a string that you want to delete:" << endl;
cin >> str;
for(list<string>::iterator iter = slst.begin(); iter != slst.end();)
{
if(*iter == str)
{
iter = slst.erase(iter);
}
else
{
++iter;
}
}
for(list<string>::iterator iter = slst.begin(); iter != slst.end(); ++iter)
cout << *iter << endl;
{
list<string> slst;
string str;
cout << "Enter some strings for the list:" << endl;
while(cin >> str)
slst.push_back(str);
cin.clear(); //使输入流重新处于有效状态
cout << "Enter a string that you want to delete:" << endl;
cin >> str;
for(list<string>::iterator iter = slst.begin(); iter != slst.end();)
{
if(*iter == str)
{
iter = slst.erase(iter);
}
else
{
++iter;
}
}
for(list<string>::iterator iter = slst.begin(); iter != slst.end(); ++iter)
cout << *iter << endl;
return 0;
}
在DOS命令行模式下,随意输入几个字符串,“Hello”, "world", "ni", "hao"输入完毕后,输入Ctrl + Z,然后输入回车,再输入Ctrl + Z,最后再输入回车,提示输入要删除的字符串,输入“hao”后,并没有删除而是显示hello world ni hao-> 这是什么原因?
经过搜集资料,原来输入流结束的条件就是在行首键入 Ctrl+Z 并回车,所以第一次输入的Ctrl+Z虽然也在回车之前,但是没有在行首,所以并不是输入流的结束符,而是被当做最后一个字符串的一部分,显示为hao->,所以没有能够删除掉字符串"hao"。
正确的做法是,先输入“Hello”, "world", "ni", "hao",然后回车(这个回车的作用是使后面输入的Ctrl+Z处在下一行的行首位置),输入Ctrl+ Z后再输入一个回车(这个回车的作用是告诉cmd.exe流输入结束了)。这样就可以了。
输入缓冲是行缓冲。当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储。每当按下回车键后,cin.get() 就会检测 输入缓冲区中是否有了可读的数据。cin.get() 还会对键盘上是否有作为流结束标志的 Ctrl+Z 或者 Ctrl+D 键 按下作出检查。