最近在学习C++,发现Eclipse中的EOF信号输入有问题,使用Ctrl+Z输入,会导致整个程序直接terminated, 与 命令行的 EOF信号输入有出入。
查询Eclipse Keys,确定EOF确实可以在I/O控制台输入EOF信号,见下图:
附上代码:
void testList(void){
list<string> slst;
string str;
//读入list对象
cout << "Enter some strings(Ctrl+Z to end):" << endl;
while(cin>>str){
slst.push_back(str);
}
cin.clear(); //使得流重新处于有效可输入状态
//读入需要寻找的值
cout << "Enter a string that you want to find:" << endl;
cin>>str;
cout << "需要删除的字符为" << "-----" << str << "-----" << endl;
cout << "输入结束,打印删除后的结果:" << endl;
//处理str对象,删除list中与str相同的元素
for(list<string>::iterator iter=slst.begin(); iter!=slst.end(); ++iter){
if(*iter == str){
iter=slst.erase(iter); //删除元素并更新迭代器
--iter; //使迭代器回退
}else{
cout << *iter << ", ";
}
}
}
运行时,在控制台中输入完内容之后,立马输入Ctrl+Z,程序就会terminated掉,见下图:
若在输入完内容之后,再输入一个Enter,然后才输入EOF,则程序的结果如下:
这个情况,在命令行中运行时,是不会出现的。我们来分析下这个情况:
cin是istream类的对象,它是从标准输入设备(键盘)获取数据,程序中的变量通过流提取符">>"从流中提取数据。流提取符">>"从流中提取数据时跳过输入流中的空格、tab键、换行符等空白字符。注意:只有在输入完数据再按回车键后,该行数据才被送入键盘缓存区,形成输入流,提取运算符">>"才能从中提取数据。(百度百科)
第一种情况,因为没有输入回车,故cin无法提取到数据,slst容器为空,但是,程序仍然跳过了后面的 cin>>str语句,不等待用户输入。
第二种情况,依然输入了回车,几个单词也存储到了slst容器中,while循环之后,str的值为最后一个单词,但是程序仍然跳过了cin>>str语句,不等待用户输入,执行到后面的for循环,将旧的str作为需要删除的内容,从而把slst的最后一个元素 you 删除掉了。
我的工程运行配置中,如下图:
Connect process input & output to a terminal 选项灰色不可勾选或取消,,求解。