#include <iostream>
using namespace std;
struct list
{
int data;
list *next;
};
list *node, *tail = NULL, *head = NULL;
void add2list();
void extrem();
int main()
{
add2list();
extrem();
return 0;
}
void add2list()
{
int input;
cout << "Adding values to list :\n";
cout << ">>";
while(cin >> input)
{
node = new list;
node->data = input;
node->next = NULL;
if (head == NULL)
{
head = node;
tail = node;
}
else
{
tail->next = node;
tail = node;
}
cout << ">>";
}
}
void extrem()
{
int x, y;
cin >> x >> y;
}
当我运行这个程序时,它只执行add2list函数????
我添加了cin.clear(),但问题没有解决,为什么?
有些人可以清楚解释如何解决这个问题和什么时候使用cin.clear()对象有用??
抱歉4我的英语不好答案 0 :(得分:2)
您的逻辑被破坏:cin >> input
和cin >> x >> y
都尝试从流中提取int
。当while
中的add2list
循环中断时,无法再从流中提取int
。重置错误标志不会突然使可解析数据出现在流中。当您尝试阅读x
时,您将再次失败,原因与您从循环中断开的原因相同。
您需要找到一种更好的方法来读取输入的不同部分,即一个用于构建列表,另一个用于读取更多数据。基于 line 的通用方法(通过std::getline
)可能是一个好的开始,您可以实现一个简单的shell,它接受“create list”等命令。
答案 1 :(得分:0)
std::cin >> value
失败有两个原因:
std::cin
已达到目的(例如,使用Ctrl-D或Ctrl-Z,具体取决于您使用的系统)value
,例如int
。但是,不提取违规字符。显然,在第一种情况下你没有任何东西:一旦你到达标准输入流的末尾,就无法扩展它。所以,我们假设您输入了一个无效字符,例如一个字母。尝试将此字母作为int
阅读将失败并导致设置std::ios_base::failbit
。在您对流做任何事情之前,您需要clear()
它。清除std::ios_base::failbit
后,您可以ignore()
下一个字符,然后重试。也就是说,如果你在通话后添加add2list()
,那么下面两个调用应该没问题,假设只有一个违规字母(否则你可能需要忽略更多字符):
std::cin.clear();
std::cin.ignore();