2016-07-01 7 views
0

プログラミングの初心者。誰かが、このコードスニペットでwhileループが何をしているのかを理解するのに役立つでしょうか?私はこのタイプのwhileループを見たことがありません。奇妙なwhileループ。困惑

しかし、私はそれがポインタ算術演算を実行していることを理解していますが、それは実際に擬似コードまたは単純な英語の観点から何が分かりますか? :)

char* 
cpy (char* s) 
{ 
    char *dest, *d; 

    d = dest = malloc(strlen(s) * sizeof(char) + 1); 

    if (d) 
    while ((*d++ = *s++)); 
    return dest; 
} 
+0

私はそれが別のソースから文字列をコピーしていると信じています。それは文字のためにそうしている。それは一行でたくさんしています。 * dを* sに設定し、次の文字の両方にインクリメントします。最終的にヌル文字(文字列の終わり)に到達すると、それはそれを返してwhileループを終了させます。 – ritlew

+1

あなたはk&r本でこれを読んだことがありますか?文字列をコピーするには 'memcpy'を呼び出す方がよいでしょう。 –

+1

デバッグのヘルプを求める質問(「なぜこのコードは動作しませんか?」)には、目的の動作、特定の問題またはエラー、およびそれを再現するのに必要な最短コード質問そのもの。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:最小、完全、および検証可能な例を作成する方法。 – Olaf

答えて

2

Cの値が0の場合はfalseを意味し、それ以外の場合はtrueを意味します。文字列は値0のヌル文字で終わります。このwhileループは、ヌル(文字列の終わり)に達するまで、sからdまでのすべての文字をコピーします。 sd両方のループがヌル文字の後にポインティングされた後*s++と同じ値を返し*d++ = *s++

割り当ては*d

に割り当てられます。ヌルもコピーされることに注意してください。

+0

は、これはまた、代入演算のですか? –

+0

はい。この関数は、ヒープ上の入力文字列のコピーを作成し、その新しい文字列へのポインタを返しています。発信者はそれを解放することを覚えていなければなりません。 – T33C

1

*d++ = *s++は実際に値を返します。そして、それはバイトを見つけるまで移動します:\0 while条件に入れると、ゼロになり、次のステートメント、すなわちreturnステートメントにジャンプします。

1

擬コード:

if dest is not null initially: 
    keep a pointer to the current character in "s" and "d". 
    (copy step) copy the current character in "s" to the same position in "d" 
    move the pointer to the next character in "d" and "s" 
    if the character copied in "copy step" was not '\0' or null: 
     jump back to "copy step" 
    otherwise: 
     break out of loop 
+0

コピーされた文字*が* ''\ 0''だったとしても(ただし、ループは終了しますが...)、コンパイラがその文字をスキップすることを決定しない限り、ポインタ' s'と 'd'を次の文字に移動する点を除いて訂正します。最後の増分、私は思います。 – Dmitri

+0

あなたは@ドミトリです。良いキャッチ –

+0

@ドミトリP.S.コンパイラがコードに対して何をするのかを話しているなら、この答えはずいぶん違うかもしれません;) –