2012-08-16 56 views
0
#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对象 - C++

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

somecan得到约如何解决这个

和当是利用cin.clear的()对象有用清楚explaintion ??

对不起4我的英语不好

+1

你怎么知道极端的ISN没有被执行?它什么都不做? – Antimony 2012-08-16 00:20:16

回答

0

有两个原因std::cin >> value可能失败:

  1. std::cin已经到达终点(例如通过使用Ctrl-d或Ctrl-Z,这取决于你所使用的系统)
  2. 中等待的字符不能被解析为value,即,你的情况为int。但是,违规角色并未提取。

很明显,在第一种情况下,你什么也没有做到:一旦你达到标准输入流的末尾,就无法扩展它。那么,让我们假设你输入了一个无效的字符,例如一个字母。试图将此信读作int将会失败并导致std::ios_base::failbit被设置。在你可以做任何事情之前,你需要clear()它。一旦你清除了std::ios_base::failbit你可以ignore()下一个字符,然后再试一次。也就是说,如果您的呼叫后加入做add2list()以下两个调用都是应该的罚款,假设只有一个违规信(否则你可能需要忽略多个字符):

std::cin.clear(); 
std::cin.ignore(); 
2

你的逻辑被打破:两个cin >> inputcin >> x >> y尝试从流中提取int秒。当while循环在add2list中断时,不再可能从流中提取int。重置错误标志不会突然使可分析数据出现在流中。当您尝试阅读x时,出于与循环中断相同的原因,您将再次失败。

您需要找到更好的方法来读取输入的不同部分,即用于构建列表的另一部分,以及用于读取其他数据的另一部分。一般线为基础的方法(通过std::getline)可能是一个良好的开端,你可以实现一个简单的外壳,需要像命令“创建列表”等