わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

strcatとstrcpyの違い

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を知っているだけでなく,文字列と配列・ポインタの関係,仮引数と実引数の関係も十分に理解できている人でしょう.
何になるか分からないという人は,とりあえずそれぞれをファイルにして,コンパイルして実行して,それから理由を考えてみてください.