2017-12-08 13 views
-2
#include <stdio.h> 

char strA[80] = "A string to be used for demonstration purposes"; 
char strB[80]; 

char *my_strcpy(char *destination, char *source) 
{ 
    char *p = destination; 
    while (*source != '\0') 
    { 
     *p++ = *source++; 
    } 
    *p = '\0'; 
    return destination; 
} 
int main(void) 
{ 
    my_strcpy(strB, strA); 
    puts(strB); 
} 

ここで私はその部分を取り出します。 // * p = '\ 0';
正確に同じ答えが表示されるので、なぜこれが必要ですか?私の理解では、\ 0は文字列の後のメモリの一部ではありませんが、配列strAはすでにその部分が含まれているので、本当に必要ですか? "C++ポインタへのポインタ

+0

最後にヌルターミネータを設定する必要があります。そうしないと、バッファがオーバーフローします。 '* p = '\ 0"を設定せずに文字列をコピーしてみてください。 –

+0

あなたが 'puts'を書いていたとしましょう。あなたはヌルターミネーターなしでどうやってやりますか? (C言語では使われていない別の規約ではありません) – chris

+1

strAに '\ 0'が含まれていても、その文字がループしている間にコピーされません(while(* source!= '\ 0' ))。 – sajas

答えて

0

ループは、\0が表示されると停止し、宛先にコピーされず、宛先がNULで終了しません。問題ありますか?

  • なく、あなたの宛先バッファがすべて0に初期化されている場合
  • ないあなたのコードは、固定長文字列一般に
  • (そうmy_strcpy署名は長さを返すように変更する必要があります)に対処するために喜んであればYESから0終わるC文字列は、以下のいない大会は、トラブルを求めているように一般的なことですが、あなたが終了し、0かない残りの値が同じになるかどうか

彼らあなたが始めたときだった。 0ターミネーションは文字配列を "標準C文字列"にするだけです。引数の便宜上

:あなただけ

for(int i = 0; i < 80; i++) 
{ 
    dest[i] = src[i]; 
} 

を行うことができますが、すべての文字列を知っていたと仮定すると、80文字のためのスペースを持っていた効果は同じであり、ソースは0が先があまりにもなります終了であると仮定します。

+0

もし私が終了しないと、strBの残りの値は0になりますか? @ John3136 –

+0

@RostamMahabadi、あなたの 'my_strcpy'関数は、' strB'が最初に使われていることさえ知る方法がありません。それは、完全に初期化されていないデータの配列、余分なスペースのない配列、またはソースと同じ配列になることも同様に簡単です。自分で終了しないと、コピーされた文字列を使用すると、多数の有効な呼び出しが予期しない動作を開始します。あなたや他の人の目的地の残りの部分をゼロにするための情報さえありません。 – chris

0

あなたがすでにヌルターミネータの重要性を知っているようだが、あなたはそれのすべてのバイトを設定し、アレイstrBの初期化の原因となる(静的な寿命を持つ)外部ネームスペース、でchar strB[80];を定義しポイントは、ありますゼロにする。だからこそ違いを見ることができないのです(null文字を追加しなくても、strBの残りの部分はすでに存在しているからです)。

の定義を移動すると、これが表示されます。 strAは問題ではないので移動する必要はありません。実際に

は、このコード

while (*source != '\0') 
{ 
    *p++ = *source++; 
} 
// *p = '\0'; 

*sourceは、それが*pにコピーされていないNULL文字、に達したとき、あなたはそのためのターミネータを追加manualkyする必要があります。

関連する問題