strcatとstrcpyは,一方が定義されていれば,それを呼び出すことで,もう一方も定義できる,という関係にあります.
関数を書いてみます.
/* strcatを呼び出して,strcpyと同じ機能を実現する関数 */ char *my_strcpy(char *dest, const char *src) { *dest = '\0'; return strcat(dest, src); }
/* strcpyを呼び出して,strcatと同じ機能を実現する関数 */ char *my_strcat(char *dest, const char *src) { strcpy(dest + strlen(dest), src); return dest; }
my_strcatについて,「return strcpy(dest + strlen(dest), src);」と書くわけにはいきません.これだと戻り値がdest + strlen(dest),すなわち,「文字列を連結する前の,文字列destの'\0'の位置」になってしまいます.