2016-10-14 7 views
0

私自身の文字列コピー機能を作成しようとしていますが、私の2つのバージョンの機能同等でした。文字列コピー機能のループ条件中にこれらの2つの違いがあります

例1つの

while (*str1 = *str2) 
{ 
    str1++; 
    str2++; 
} 

str1str2は私の関数に渡す2つの文字列イムある2

while (*str1) 
{ 
    str1 = str2; 
    str1++; 
    str2++; 
} 

最初の例は期待通りに機能しますが、2番目の例では文字列を最初の文字列の長さに制限しています。私の文字列コピーの第二のバージョンは

str1は今最初の作品はproperl abcdef

で実行された後

もしそうなら

str1ABCDEF

str2abcdefghijkl

されています私はwhile条件が犯人であると仮定していabcdefghijkl

str1予想通りyは今です。 2つの条件(*str1)(*str1 = *str2)の違いは何ですか?私はまだC/C++を勉強していますので、ごめんなさい。

+1

あなたが望むのは、最初のものです。もう1つはそれほどではありません。 –

+0

1. CとC++は別の言語です。彼らはいくつかのことを分かち合っていますが、決して同じものとはみなされません。 2. 'str1'をどのように割り当てて、より長い文字列で動作させるのですか?割り当てられたメモリを越えて書くとUB – UnholySheep

+0

となります。2番目のコードで 'str1 = str2;'の代わりに '* str1 = * str2; – chux

答えて

5

str1 = str2*str1 = *str2の間には大きな違いがあります。最初のポインタは、ポインタstr2のアドレスをポインタstr1に割り当てます。次にが指し示す要素をstr1が指すスペースに割り当てます。

そしてwhile条件があまりにも少し異なっている: while (*str1 = *str2)が効果的にこのassigmentの結果をチェック - そう*str2を。

+0

私はstr1 = str2を置くつもりはありませんでした。今すぐ修正しました。 – TomaszS

1

2番目のバージョンでは、str1 ++はポインタを増分して文字列を回転させます。

ながら(* 0009)

現在位置の値がNULLの場合、各増分の後に、求めています。そうであれば、whileループは終了します(str1が長いほど何度も実行されます)。

最初のバージョンは例外的に悪いコード(IMO)です。私はwhile式の中で割り当てとテストをしません。このコードを読んでいる人の90%は、それが見えないでしょう。

編集:パーセンテージが変更されました。

+0

27人の視聴者で私は自分自身であるため、割り当てを直ちに見た人の7%+がループ内で行われました。 – chux

+0

私はそれを見ました。私は決してそれをしません。 93%が最初の見解でそれを見逃すでしょう。 –

+1

Cツールボックスの正しいツールを使用して、適切なジョブを実行します。時には 'while 'の代入は' int ch;のように慣用的です。 while((ch = getchar())!= '\ n' && ch!= EOF){do_stuff(ch);} } '。確かにそれは別の方法で行うことができます。 IAC、グループのコーディング基準に従ってください。 BTW:@ KIIVもそれを見たので、_least_ 10%はそれを見た。 – chux

1

最初の値はstr2の値をstr1に割り当てます。したがって、str2の値がNULLの場合、条件は失敗します。

str2がstr1のアウトバウンドに書き込むstr1より大きい場合は上記のように悪いことであり、したがってsegfaultです。

2番目の文字列は、NULL終端文字でない限りstr1の値をスキャンし、trueを返します。したがって、NULL終端文字に達してから途切れるまで続きます。

注意:あなたがポイントにどこポインタSTR2へのポインタstr1はポイントを作る第二内部ループで

!動的に割り当てられている場合は、「メモリリーク」を行ってください。

char* str1 = new char[10]; 
char* str2 = new char[20]; 

while(*str1) 
{ 
    str1 = str2; // Memory leak you should cleaned str1 before here! 
    //.... 
} 
+0

最初のものは割り当てであり、比較ではありません。 –

+0

@PeteBecker申し訳ありませんが、私はそれに気付かなかった。 – Raindrop7

関連する問題