2012-04-19 5 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がすべての空白が削除された文字以外の文字列であると期待しています。私は問題はポインタを参照解除されたと仮定し、もしそうなら、どのように私は、現在を追加することができ

rint x; 



int x; 



nt x; 



t x; 



x; 



; 

...

int x := 1 + 2; 
print x; 



nt x := 1 + 2; 
print x; 



t x := 1 + 2; 
print x; 

:代わりに、私は次のような何かを得ますポインタの位置の文字?私はそれがないデrefrenceをすれば、私はinvalid conversion from ‘char’ to ‘const char*’

で終わる注: is_whitespace()私がテストし、期待どおりに動作しています。それは起こりうる問題として排除することができます。

+0

「ポインタ」とは何ですか? – karlphillip

+0

なぜあなたは 'Pointer'の代わりに' it'を書いておらず、 'advance(Pointer、1)'の代わりに '++ it'をしていますか?また、 'is_whitespace(0)'の代わりに['std :: isspace(* it)'](http://en.cppreference.com/w/cpp/string/byte/isspace)を使うのはなぜですか?あなたは不必要に複雑にしています。 – Nawaz

+0

ポインタは文字列イテレータ* – grep

答えて

1

CurTokenPointerの種類は何ですか? CurTokenstd::stringのようになります。 Pointerstd::string*ですか? appendにはかなりのオーバーロードがあります。そのうちの一つは、次のとおりです。

string& append (const string& str); 

あなたはその1をヒットする場合は、あなただけの間接参照ポインタ与える「&」を取り除く必要があります。

CurToken.append(*Pointer); 

動作しますが、ということを忘れてはなりませんそれは文字だけでなく文字列全体を追加します。もしそれがなければ、おそらくappend()の過負荷がどれくらい当たっているのか把握する必要があります。最初の文字のみを使用する場合は、次のように試してください:

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

Perfect。ここでは、私がCurToken.append(1、( Pointer)[0]); ' – grep

7
CurToken.append(&*Pointer); 

ポインタがPointerであると仮定すると、それは

CurToken.append(Pointer); 

と同等だとCurToken(それはCスタイルゼロで終了する文字列を指すと仮定上の文字列の全体の尾部を追加します。あるかどうターミネーターがない場合、何かが起こる可能性があります)。

CurToken.append(*Pointer); 

UPDATE:あなただけの現在の文字を追加したいように見えますがPointerstd::string::iteratorであると言います。その場合、&*Pointerはまだ文字へのポインタです。 appendはそれをCスタイルの文字列へのポインタとして解釈します。文字列内の文字は必ずしも終了する必要はないので(実際には、特にC++ 11ライブラリではほぼ確実です)、未定義の動作があります。

+0

' Pointer'は自家製のスマートポインタです。 –

+0

'string :: iterator Pointer;' – grep

+0

@MarkB:おそらく;かなりたとえそうであっても、 '&*'は普通のポインタの場合と同じ効果を持ちます。 –

関連する問題