strcatは文字列を連結する関数,strcpyは文字列をコピーする関数です.
ともに引数を二つとります.オンラインマニュアルなどを見て知ることのできる「仮引数」は,文字列の先頭を指すポインタ変数になります.
第1引数の指し示す先は,処理結果が格納される配列になります.第2引数の指し示す先は,文字列リテラルでもかまいませんし,第1引数と同様に配列でもかまいません.
呼び出す側,つまり「実引数」で書く場合には,第1引数は,文字配列の変数名か,文字配列のどこかを指し示すポインタ値になるでしょう.第2引数は,配列変数名か,文字列リテラルを指し示すポインタ値か,または何らかの文字列のどこかを指し示すポインタ値です.
そこで問題です.次の4つのプログラムは,それぞれ何を出力するでしょうか?
#include <stdio.h> #include <string.h> int main(void) { char s[256] = "abc"; char *t = "123"; strcat(s, t); printf("%s\n", s); return 0; }
#include <stdio.h> #include <string.h> int main(void) { char s[256] = "abc"; char *t = "123"; strcpy(s, t); printf("%s\n", s); return 0; }
#include <stdio.h> #include <string.h> int main(void) { char s[256] = "abc"; char *t = "123"; strcat(s + 1, t); printf("%s\n", s); return 0; }
#include <stdio.h> #include <string.h> int main(void) { char s[256] = "abc"; char *t = "123"; strcpy(s + 1, t); printf("%s\n", s); return 0; }
実際に実行することなく答えが思い浮かぶ人は,strcatとstrcpyを知っているだけでなく,文字列と配列・ポインタの関係,仮引数と実引数の関係も十分に理解できている人でしょう.
何になるか分からないという人は,とりあえずそれぞれをファイルにして,コンパイルして実行して,それから理由を考えてみてください.