2017-11-21 4 views
2

私はポインタを把握しようとしていますが、私はいくつかの説明が必要なこの簡単なコードを持っています。C++はポインタを使用してコピーします

文字配列を別の配列にコピーする必要があります。私はこのコードを持っている私の主な機能には:

const int MAX_SIZE = 100; 

char x[MAX_SIZE] = "1234565"; 
char* y = new char[MAX_SIZE]; 

copyArray(x, y);  
std::cout << y; 

delete [] y; 

今、質問が来ると、どのように(突起部正常に動作します)このコードがない:

while ((*dest = *source) != '\0') 
{ 
    dest += 1; 
    source += 1; 
} 

(末尾に奇妙な文字を提供します)、この異なります:

while (*source != '\0') 
{ 
    *dest = *source; 

    dest += 1; 
    source += 1; 
} 

これを見ると、これらの2つの機能はかなり類似しているようです。 ソース文字列のヌルターミネータに達するまでコピーしていますが、右(2番目の関数)ですか?

正しく動作しません - コピーされた配列の最後に奇妙な文字があります。しかし、最初の関数は正常に動作します。

void copyArray(const char* source, char* dest); 
+0

いいえ、私は提案されたタグを2回行いました。申し訳ありません – daavid245

+5

'while((* dest = * source)!= '\ 0')'は必要な終了文字 '\ 0''がループの前にコピーされることを保証します。終了する。また、http://idownvotedbecau.se/nodebugging/ – user0042

+0

を参照してください。2番目の例では、文字列を終了しないことを意味する '\ 0'を検出すると、ループを中断しますか? – daavid245

答えて

1

(*dest = *source)これだけint i = 1+1;の1 + 1部のような評価式であることが評価された後、値を用いることができる他の発現における

差はすなわち、((*dest = *source) != '\0')内の値です。 * sourceが* destに割り当てられている場合、*sourceが指す値は*source != '\0'の評価にのみ使用されますが、その文の評価中は割り当てられませんが、式全体が評価されます(式は*sourceと同じ値です)。


EDIT

user0042は本当に急性の観察をもたらします。そうすることによって、次のコード

while ((*dest = *source) != '\0') 
{ 
    dest += 1; 
    source += 1; 
} 

は、配列の最後の文字が「\ 0」の値を持っていることを保証し

0

この例では、x, yのアドレスを最後の文字までインクリメントして、Nullターミネータを指しているので、一時変数を保持する必要があります最初のアドレス:

char* x = "1234565"; 
char* y = new char[MAX_SIZE]; 

// Temporary pointers to hold the first element's address 
char* tmp1 = x; 
char* tmp2 = y; 

while((*y = *x) != '\0'){ 
    x += 1; // X no longer points to the first element 
    y += 1; // Y no longer points to the first element 
} 

std::cout << tmp2; 
  • あなたはdo whileループの代わりwhile使用することができますので、最後の文字\0をインクリメントする前に値を割り当てると、前のループを中断しますので

    char* x = "1234565"; 
    const int size = strlen(x); 
    char* y = new char[size]; 
    
    char* tmp1 = x; 
    char* tmp2 = y; 
    
    do{ 
        *y = *x; 
        x += 1; 
        y += 1; 
    }while(*(x - 1) != '\0'); 
    
    // Now no need for adding a null-terminator it is already added in the loop 
    // tmp2[size] = '\0'; 
    
    std::cout << tmp2; 
    

を宛先ポインタyに追加されます。したがって、私はn = '\0'ではなく、n - 1 = '\0'にループブレイクを作成して、yに追加するようにしました。

+1

彼は両方の例で 'x'と' y'をインクリメントします – Sirmyself

1

形終端'\0'文字に達した場合にコピーする文字((*dest = *source))の割り当てが条件をテストする前に適用されること

while ((*dest = *source) != '\0') 
{ 
    dest += 1; 
    source += 1; 
} 

保証はfalseに評価されます。

*dest = *source; 

文がこれまでに到達する前に、ループが終了するため、2番目のバージョンは、終了'\0'文字をコピーしません。

関連する問題