- ベストアンサー
strcpy関数について(\0のコピー)
'\0'のsrcからdstへのコピーについて考えて見たのですが、 char *strcpy(char *dst,const char *src) { int i=0; for(i=0;src[i]!='\0';i++) dst[i]=src[i]; dst[i]=src[i];←1 return dest; } このプログラムではfor文の真偽値の判定の段階では'\0'がsrcからdstにコピーできていないので1のdst[i]=src[i]でコピーする必要がありますが、以下のようにプログラムを変更すると char *strcpy(char *dst,const char *src) { int i=0; for(i=0;(dst[i]=src[i])!='\0';i++) ; return dest; } (dst[i]=src[i)の代入式の段階でsrcからdstにコピーしその後でfor文の真偽値の判定をするので、真偽値判定前にdst側配列に'\0'が入っていると言う考えでこのプログラムを理解して良いのでしょうか。なにかミスしそうなプログラムですが、考え方として、私の言っている事は正しいでしょうか。宜しく回答願います。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
御理解の通りです。 コンパイラにアセンブラリストの出力機能があるなら、それを使って、 どのようにネイティブコードになるかを調べられます。 私はアセンブラから、この業界に入ったので、C言語での開発を始めた頃は いつもアセンブラリストを出力して、意図した動作になるか確認していました。 ところで、最適化を最大にしていると、思わぬ落とし穴にハマることがあるので、 自分でも紛らわしいと思うコーディングは避けた方がよいでしょう。
その他の回答 (1)
- 64bit
- ベストアンサー率51% (45/88)
正しいです。 K&Rには、こんなソースが書いてあるそうですし。ほぼ同じことをやっていますね。 void strcpy(char *s, char *t) { while(*s++ = *t++); } ただ、わかりやすい書き方で書くのが一番です。
お礼
ご回答有難うございました。 確かに最初にこのプログラムを見たとき、落とし穴にハマる気がしました。 私としては、確信が持てなくて質問しましたが、正しく理解していたと、安心しました。有難うございました。