strcpy の使用について質問があります。ANSI C 規格に次のように書かれていることは知っています。Linux で古い gnu C コンパイラを使用してコンパイルした場合に期待どおりに動作するコードを示します。
#include <string.h>
#include <stdio.h>
char S[80],*P;
int main() {
strcpy(S,"abcdefghi\r\njklmnopqr\r\nstuvwxyz\r\n");
for (P=S; P=strchr(P,'\r'); P++) strcpy(P,P+1);
printf("%s\n",S);
return 0;
}
\r
このシーケンスは、入力文字列からすべての (キャリッジ リターン) を削除します。strcpy の非常に単純な実装は次のとおりであることを (Kernigham と Ritchie から) 知っています。
while (*t++=*s++) ;
ここで、gcc (Gentoo 4.5.4 p1.0, pie-0.4.7) 4.5.4 を使用してプログラムをコンパイルすると、次のように出力されます。
abcdefghi
jklmnpqr <-- missing 'o'
stuvwxxyz <-- doubled 'x'
このコンパイラ (実際にはそのライブラリ) は に対して非常に洗練されたシーケンスを使用しているstrcpy
と思いますが、その理由はわかりません。