2012-04-19 129 views
1

當我將迭代器附加到字符串時,我遇到了一些意外的字符串行爲。基本上,我有讀取的線沿線的東西文件:C++追加字符串指針

int x := 10; 
print x; 

我有一個字符串已包含此文件的內容,而我通過它進行迭代,只是現在刪除空白。

void Lexer::parse() 
{ 
    Pointer = Filestring.begin(); // both private members 
    while(Pointer < Filestring.end()) 
    { 
     if(is_whitespace(0)) // 0 indicates current Pointer position 
     { 
      advance(Pointer, 1); 
      continue; 
     } 

     CurToken.append(&*Pointer); // CurToken is private member string 
     advance(Pointer, 1); 
    } 

    cout << CurToken << endl; 
} 

通過循環結束時,我會期望CurToken是沒有包含任何內容,但是去除了所有空白字符的字符串。相反,我得到類似如下:

int x := 1 + 2; 
print x; 



nt x := 1 + 2; 
print x; 



t x := 1 + 2; 
print x; 

...

rint x; 



int x; 



nt x; 



t x; 



x; 



; 

我認爲這個問題是去引用指針,如果是這樣,我怎麼能追加當前指針位置的字符?如果我沒有反駁它,我最終與invalid conversion from ‘char’ to ‘const char*’

注意: is_whitespace()我測試過了,並按預期工作。所以這可以排除爲一個可能的問題。

+0

什麼是「指針」? – karlphillip 2012-04-19 14:53:44

+0

你爲什麼不寫''而不是'指針'而是'++ it'而不是'advance(指針,1)'?另外,爲什麼不['std :: isspace(* it)'](http://en.cppreference.com/w/cpp/string/byte/isspace)而不是'is_whitespace(0)'?你不必要地使它變得複雜。 – Nawaz 2012-04-19 14:55:49

+0

指針是一個字符串迭代器* – grep 2012-04-19 14:55:55

回答

1

CurTokenPointer是什麼類型? CurToken看起來像std::string。是Pointer a std::string*append有相當多的重載。其中之一是:

string& append (const string& str); 

如果你想打一個,你應該擺脫的「&」給你只是取消引用指針:

CurToken.append(*Pointer); 

這應該工作,但要記住,它會追加整個字符串,而不僅僅是字符。如果不是這樣,你可能需要弄清楚它打的是哪個超載append()。如果您只想要第一個字符,請嘗試:

CurToken.append(1, (*Pointer)[0]); 
+0

完美,我認爲你最好理解我在這裏想完成什麼,儘管我必須使用'CurToken.append(1,(指針)[0]);' – grep 2012-04-19 16:10:39

7
CurToken.append(&*Pointer); 

假設Pointer是一個指針,這是相當於

CurToken.append(Pointer); 

,並將該字符串的整個尾部追加到CurToken(假設它指向一個C語言風格的零終止的字符串;如果有沒有終結者然後會發生任何事情)。看起來你只是想追加當前字符:

CurToken.append(*Pointer); 

UPDATE:你說Pointerstd::string::iterator。在這種情況下,&*Pointer仍然是指向角色的指針;並且append仍然將其解釋爲指向C風格字符串的指針。由於字符串中的字符不一定終止(儘管在實踐中它們幾乎肯定會是,尤其是在C++ 11庫中),但是您有未定義的行爲。

+0

我會假設'指針'是一個家釀的智能指針。 – 2012-04-19 14:57:05

+0

它的'string :: iterator指針;' – grep 2012-04-19 14:59:26

+0

@MarkB:也許;挺複雜的一個,因爲你可以對它進行算術運算,即使如此,'&*'的效果就好像它是一個普通的指針一樣 – 2012-04-19 14:59:29