C++ cin对象-c++; #包括 使用名称空间std; 结构列表 { int数据; 列表*下一步; }; 列表*节点,*tail=NULL,*head=NULL; void add2list(); 无效极值(); int main() { add2list(); 极值(); 返回0; } void add2list() { int输入; cout>输入) { 节点=新列表; 节点->数据=输入; 节点->下一步=空; if(head==NULL) { 头部=节点; 尾=节点; } 其他的 { tail->next=节点; 尾=节点; } cout>x>>y; }

C++ cin对象-c++; #包括 使用名称空间std; 结构列表 { int数据; 列表*下一步; }; 列表*节点,*tail=NULL,*head=NULL; void add2list(); 无效极值(); int main() { add2list(); 极值(); 返回0; } void add2list() { int输入; cout>输入) { 节点=新列表; 节点->数据=输入; 节点->下一步=空; if(head==NULL) { 头部=节点; 尾=节点; } 其他的 { tail->next=节点; 尾=节点; } cout>x>>y; },c++,cin,C++,Cin,当我运行这个程序时,它只执行add2list函数 我添加了cin.clear(),但问题没有解决,为什么 有些人可以对我如何解决这个问题给出明确的解释 什么时候使用cin.clear()对象有用 抱歉,4我的英语不好您的逻辑被破坏了:cin>>input和cin>>x>>y尝试从流中提取ints。当while中的while循环add2list中断时,无法再从流中提取ints。重置错误标志不会突然发生y使可解析数据出现在流中。当您尝试读入x时,您将再次失败,原因与中断循环相同 您需要找到一种更好的

当我运行这个程序时,它只执行add2list函数

我添加了cin.clear(),但问题没有解决,为什么

有些人可以对我如何解决这个问题给出明确的解释

什么时候使用cin.clear()对象有用


抱歉,4我的英语不好

您的逻辑被破坏了:
cin>>input
cin>>x>>y
尝试从流中提取
int
s。当
while
中的
while
循环
add2list
中断时,无法再从流中提取
int
s。重置错误标志不会突然发生y使可解析数据出现在流中。当您尝试读入
x
时,您将再次失败,原因与中断循环相同


您需要找到一种更好的方法来读取输入的不同部分,即一种用于构建列表,另一种用于读取更多数据。基于行的通用方法(通过
std::getline
)可能是一个很好的开始,您可以实现一个简单的shell,该shell使用“create list”之类的命令等等。

有两个原因导致
std::cin>>值
失败:

  • std::cin
    已结束(例如,使用Ctrl-D或Ctrl-Z,具体取决于您使用的系统)
  • 挂起的字符无法解析为
    ,即在您的情况下为
    int
    。但是,不会提取有问题的字符
  • 显然,在第一种情况下,您什么都做不到:一旦您到达标准输入流的末尾,就没有办法扩展它。因此,假设您输入了无效字符,例如字母。尝试将此字母作为
    int
    读取将失败,并导致设置
    std::ios_base::failbit
    你可以对流执行任何需要清除的操作。
    clear()
    一旦清除了
    std::ios\u base::failbit
    你就可以
    ignore()
    下一个字符,然后再试一次。也就是说,如果在调用后添加,请执行
    add2list()
    假设只有一个违规字母(否则您可能需要忽略更多字符),以下两个调用应该没问题:


    你怎么知道extreme没有被执行?反正它什么都没做?
       #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;
        }
    
    std::cin.clear();
    std::cin.ignore();