2011-08-05 16 views
0

2回目のwhileループでは、データが追加されていることを確認しましたが、lenがインクリメントされた後でも、どのような文字列[walker + * len]がNUL( '\ 0'ここで何がエラーですか?文字列配列が値を読み取っていませんか?

char* getWord(char* string, short* len) 
{ 
size_t walker = 0; 

    /*POINT TO THE FIRST CHAR*/ 
    while (string[walker] == ' ' || string[walker] == '\0') 
    ++walker; 


while (string[walker + *len] != ' ' || string[walker + *len] != '\0' ) 
    ++(*len); 

return (&string[walker]); 
+1

コードがもっと必要ですが、どのように関数を呼び出すのですか? – knittl

+0

あなたのコードの問題は、呼び出し元と呼び出し先の間の明示的な契約にあります。具体的には、誰が '* len'を初期化する責任がありますか?あなたが発信者のコードを提供していないので、私たちは何が起こっているのか推測しています。このような推測を避けるために、最小限の完全でコンパイル可能なサンプルプログラムを提供してください。このようなプログラムの作成方法と利点については、http://sscce.org/を参照してください。 –

+0

'' ''のような文字列を渡すと、最初のループは壊れます。なぜなら、文字列の終わりを超えて読み込まれ、空白でないnull以外のバイトが見つかるまでです。これはあなたが意図したものではありそうもありません。 2番目のループでは、 'len'にどのような値があるのか​​分からないので、' walker + * len'でインデックスを作成するのが安全かどうかはわかりません。おそらく、* len = 0;を2番目のループの前に設定しようとしたでしょう。第2のループ条件も壊れている。 'string [walker + * len] == '''ならば、2番目の条件は真です。それ以外の場合は最初のコードなので、コードがクラッシュするはずです。 '||' vs '&&'と否定的な条件に注意してください。 –

答えて

1

あなたはそこにいくつかのロジックのバグを持っている - それがこのようなものでなければなりません:

char* getWord(char* string, short* len) 
{ 
    size_t walker = 0; 
    *len = 0; // << initialisation of *len 

    /*POINT TO THE FIRST CHAR*/ 
    while (string[walker] == ' ') // << remove incorrect check for end of string 
    ++walker; 

    while (string[walker + *len] != ' ' && string[walker + *len] != '\0') // << fix logic for testing for space or end of string 
    ++(*len); 

    return &string[walker]; 
} 
+0

おそらく、2番目のwhileループの代わりにisalphaですか?(またはisalnum) – Lalaland

+0

@Ethan:そう、より堅牢です。情報の過負荷を避けるために変更を最小限に抑えようとしたので、確定したバグを修正しました。もちろん、改善の余地はまだたくさんあります。 –

0

は、あなたがあなたの関数を呼び出すとき*lenが0であることを確認していますか?それを初期化する必要はありませんか?また、2番目の条件では、||ではなく&&を使いたいと思うでしょう。

関連する問題