2012-08-16 54 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)可能是一個良好的開端,你可以實現一個簡單的外殼,需要像命令「創建列表」等