Eclipse CDT EOF信号输入 问题,求大神下凡

最近在学习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掉,见下图:

Eclipse CDT EOF信号输入 问题,求大神下凡_第1张图片


若在输入完内容之后,再输入一个Enter,然后才输入EOF,则程序的结果如下:

Eclipse CDT EOF信号输入 问题,求大神下凡_第2张图片


这个情况,在命令行中运行时,是不会出现的。我们来分析下这个情况:


cin是istream类的对象,它是从标准输入设备(键盘)获取数据,程序中的变量通过流提取符">>"从流中提取数据。流提取符">>"从流中提取数据时跳过输入流中的空格、tab键、换行符等空白字符。注意:只有在输入完数据再按回车键后,该行数据才被送入键盘缓存区,形成输入流,提取运算符">>"才能从中提取数据。(百度百科)




第一种情况,因为没有输入回车,故cin无法提取到数据,slst容器为空,但是,程序仍然跳过了后面的 cin>>str语句,不等待用户输入。

第二种情况,依然输入了回车,几个单词也存储到了slst容器中,while循环之后,str的值为最后一个单词,但是程序仍然跳过了cin>>str语句,不等待用户输入,执行到后面的for循环,将旧的str作为需要删除的内容,从而把slst的最后一个元素 you 删除掉了。


我的工程运行配置中,如下图:

Eclipse CDT EOF信号输入 问题,求大神下凡_第3张图片

Connect process input & output to a terminal 选项灰色不可勾选或取消,,求解。

你可能感兴趣的:(Eclipse CDT EOF信号输入 问题,求大神下凡)