2010-08-27 108 views
1

作爲一個練習,我試圖創建一個輸入流操縱器,它會吸取字符並將它們放入字符串中,直到遇到特定字符或直到達到eof。這個想法來自布魯斯Eckel的「在C++思考」頁249創建輸入流操縱器

下面的代碼我到目前爲止:

#include <string> 
#include <iostream> 
#include <istream> 
#include <sstream> 
#include <fstream> 
#include <iomanip> 
using namespace std; 

class siu 
{ 
    char T; 
    string *S; 
public: 

    siu (string *s, char t) 
    { 
     T = t; 
     S = s; 
     *S = ""; 
    } 


    friend istream& operator>>(istream& is, siu& SIU) 
    { 
     char N; 
     bool done=false; 
     while (!done) 
     { 
      is >> N; 
      if ((N == SIU.T) || is.eof()) 
       done = true; 
      else 
       SIU.S->append(&N); 
     } 
     return is; 
    } 
}; 

,並對其進行測試....

 { 
      istringstream iss("1 2 now is the time for all/"); 
      int a,b; 
      string stuff, zork; 

      iss >> a >> b >> siu(&stuff,'/'); 
      zork = stuff; 
     } 

的想法因爲siu(& stuff,'/')會從iss中吸取字符,直到它遇到/。我可以用調試器看它,因爲它通過'/' 獲得字符'n''o''w'並終止循環。這一切似乎都在發展,直到我看到Stuff。東西有現在的角色等但它們之間有6個額外的字符。下面是一個示例:

  • &東西0x0012fba4 {0x008c1861 「nÌÌÌýoÌÌÌýwÌÌÌýiÌÌÌýsÌÌÌýtÌÌÌýhÌÌÌýeÌÌÌýtÌÌÌýiÌÌÌýmÌÌÌýeÌÌÌýfÌÌÌýoÌÌÌýrÌÌÌýaÌÌÌýlÌÌÌýlÌÌÌý」}

這是怎麼回事?

回答

3

這條線:

SIU.S->append(&N); 

追加字符作爲一個char *。 append函數需要一個以空字符結尾的字符串,因此它會繼續讀取N,(& N)+1 ...直到它看到一個零字節。

您可以組成一個小型空終止字符數組,並把它傳遞,或者您可以使用備用追加函數,它接受一個計數和字符追加:

SIU.S->append(1, N); 
+0

謝謝!如此接近但沒有雪茄。我將它改爲SIU.S-> append(&N,1),因爲我確實想包括空格,所以我替換了>> N;與N = is.get()。似乎按我現在所希望的那樣工作。 – 2010-08-27 01:55:13

+0

更簡單:while(is >> n)siu.s + = n;注意:所有大寫標識符 - 按照慣例 - 爲預處理器定義保留...使用它們會導致很難追蹤的錯誤。 (雖然奇怪的是,單個字母的ala模板,U等是常見的實踐) – 2010-08-27 02:23:58

+0

@Tony:任何不以任何下劃線開頭的東西都是語言保留的。不過,任何優秀的風格指南都包含該規則。 – Potatoswatter 2010-08-27 05:54:51