1

私は同じことをするこれらの2つの関数を持っています(strcpy()関数):

最初の実装:

void strcpy(char* des_str, const char* src_str) 
{ 
   int j = 0; 
   while ((dest_str[j] = src_str[j])!= '\0')) 
   j++; 
}

2番目の実装:

void strcpy(char* des_str, const char* src_str) 
{ 
   while ((*dest_str = *src_str)!= '\0')) 
   { 
      src_str++;
      dest_str++; 
   } 
} 

プログラマーは通常、どのスタイル/実装をC好みますか?「配列」アプローチまたは「ポインタ」アプローチ?2つの実装の間に「美的」な違い以外の違いはありますか?

4

5 に答える 5

3

生成されたマシンコードは、どちらもまったく同じになると思います。(最適化あり)

したがって、それは読みやすさの問題にすぎません。あなたとあなたのチームが最もよく知っているバージョンを使用してください。ここで最も重要なことは、プログラマーがこのソースコードを見たときに、この関数が何をするのかを考える時間を失う必要がないということです。

于 2012-11-27T15:00:14.980 に答える
1

Didierによって指定されているように、マシンで生成されたコードは同じように見え、この場合のパフォーマンスも同じになります。しかし、私は提案します

1)strcpyを使用するのではなくstrncpyを使用する。strncpy(des、src、noOfcharToCopy);

2)最初から始めるよりも、srcの終わりからdesの終わりにコピーする方がよい。bczは、srcがアドレス105で始まり、サイズが10で、desがアドレス100で始まる場合、srcデータは105アドレスのdesで上書きされます。「des」は実際の値を保持し、次にsrcを保持する必要があると表示されます。

于 2012-11-27T19:18:15.447 に答える
0

それは私が言うプログラマーに依存します。主な違いは、最初の実装では新しい変数を作成してこれを変更するだけで、2番目の実装では2つの既存の変数を変更することです。サイズと速度の問題です(ただし、非常に小規模です)

于 2012-11-27T14:58:03.090 に答える
-1

最初の実装、つまりアレイの実装は正しく、推奨されます。しかし、それはプログラマー次第です。ベストプラクティスは、ポインタを変更/変更しないことです。つまり、開始アドレス/ベースアドレスを保持する必要があり、インクリメントまたはデクリメントしないでください。

于 2012-11-27T16:29:20.073 に答える
-2

私が知っている限り、これはより一般的です:

void strcpy(char* des_str, const char* src_str) 
{ 
  while ((*dest_str = *src_str)!= '\0')) 
  { 
    src_str++;
    dest_str++; 
  } 
} 

より正確には、通常は次のように実装されていると思いますが、メモリを割り当てる必要がないため(int)と推測できます。

++src_str
++dest_str

接尾辞のインクリメントは、インクリメントされる前に「前の値」として使用する新しいintを作成する必要があるためです。

于 2012-11-27T14:58:58.620 に答える