• ベストアンサー

strcat関数を自作したいです

失礼します。 私はC言語を勉強し始めて3週間の超初心者なのですが、今関数の勉強をしており、例題でstrcat関数を自作してみようと思っています。  が、作り方が分からず、他のサイト、書物、質問なども参考にしてみましたが説明を読んでも理解できませんでした。 どなたかstrcat関数を初心者にも分かりやすいように自作例を作っていただけると大変幸いです。できるだけ簡単で分かりやすいコードなら助かります。 宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

> >const char * restrict s2 > の最初が「const」になっている理由は何でしょうか・・・? 第一の理由は、これがstrcatの仕様だからです。 第二の理由としては、コピー元の文字列は変更されることがないため、そのことを呼び出し元に保証するために付けています。

その他の回答 (7)

  • S117
  • ベストアンサー率40% (18/45)
回答No.8

「できるだけわかりやすいコード」で。 char *strcat(char *dest, const char *src) {   size_t i;   size_t l;   /* 結合先の文字列の終端を探す */   for (l = 0 ; dest[l] != '\0' ; l++)     ; //このfor文に本体はない   /* コピー元の文字列の終端まで結合先の文字列の末尾にコピー */   for (i = 0 ; src[i] != '\0' ; i++)   {    dest[l + i] = src[i];   }   /* 最後に終端を示す'\0'を代入 */   dest[l + i] = '\0';   return dest; /* 戻り値は結合先のポインタ */ } これでどうでしょ?

回答No.7

char* strcat(char* s1, const char* s2) {  char* result = s1;  strcpy(s1+strlen(s1),s2);  return result; } ※ で、ついでに strlen,strcpyも自作する、と。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.5

>>const char * restrict s2 >の最初が「const」になっている理由は何でしょうか・・・? s2が指している部分はコピー元であるため、 そこの内容を改変しない、という意思を表明しています。

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.4

>最後はreturn s1でも良いのでしょうか? >ポインタを作らなければならないのでしょうか。 「ポインタを作る」とは何を意味しているのか補足にどうぞ。 また s1 は return するときに何を指しているのかも補足にどうぞ。 >あとwhile(*s1++ = *s2++);と while(*s1++); >は色々間に省かれているような気がするのですが、それを省かずに >表すとどうなるのでしょうか・・・? 省かれてはいません。 演算子の優先順位と ++ 演算子の前置と後置の違いについて復習しましょう。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

こんなところです。 char *strcat(char * restrict s1, const char * restrict s2) {  char *s = s1;  while (*s1 != '\0') ++s1;  while ((*s1 = *s2) != '\0') ++s1, ++s2;  return s; }

elkmarchan
質問者

お礼

質問に回答していただき大変感謝しております。 大変恐縮ですが質問させていただくと、 >const char * restrict s2 の最初が「const」になっている理由は何でしょうか・・・? それとwhile ((*s1 = *s2) != '\0') は「s2の値にヌルが入るまでs2の値をs1の値に代入し続ける」という ことなのでしょうか? 超初心者の大変低レベルな質問で申し訳ございません。

  • MoguraSE
  • ベストアンサー率64% (81/126)
回答No.2

こんにちは。 string.h で宣言されているstrcat()ですね。 いつもお世話になっています(笑) 例です。 strlen()は文字列の長さを測って返す関数です。 memcpy()はメモリの内容をコピーする関数です。 int my_strcat(char *str_a,const char *str_b) { int l,s; s = strlen(str_a); l = strlen(str_b); memcpy(str_a + s,str_b,l + 1); return (s + l); } 実行すると、str_aの変数のお尻にstr_bの変数の内容を追加します。 戻り値は返されたstr_aの文字列の長さ(ヌル'\0'を含まない)です。 memcpyの第3引数で+1しているのは、ヌル'\0'をコピーして文字列を終端させるためです。 memcpyを使わないのなら、forやwhileループで1文字ずつコピーしてもいいんですが…手抜きです(汗)

elkmarchan
質問者

お礼

質問にお答えいただき大変感謝しております。 とりあえず特殊な関数を使わずに自作してみたいと思うのです。。 それとちょっと内容が自分にはレベル高すぎる気がします。(へタレですみません) ですが大変参考になりました。ありがとうございます。

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

strcat の仕様を補足にどうぞ。

elkmarchan
質問者

補足

char *p = s1; while(*s1++); /* s1を最後迄進める */ while(*s1++ = *s2++); /* s2をコピーする */ return p; 最後はreturn s1でも良いのでしょうか? ポインタを作らなければならないのでしょうか。 あとwhile(*s1++ = *s2++);と while(*s1++); は色々間に省かれているような気がするのですが、それを省かずに 表すとどうなるのでしょうか・・・?

関連するQ&A

専門家に質問してみよう