プロが教える店舗&オフィスのセキュリティ対策術

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

どなたかstrcat関数を初心者にも分かりやすいように自作例を作っていただけると大変幸いです。できるだけ簡単で分かりやすいコードなら助かります。

宜しくお願いいたします。

A 回答 (8件)

> >const char * restrict s2


> の最初が「const」になっている理由は何でしょうか・・・?

第一の理由は、これがstrcatの仕様だからです。
第二の理由としては、コピー元の文字列は変更されることがないため、そのことを呼び出し元に保証するために付けています。
    • good
    • 1

「できるだけわかりやすいコード」で。



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; /* 戻り値は結合先のポインタ */
}

これでどうでしょ?
    • good
    • 1

char* strcat(char* s1, const char* s2) {


 char* result = s1;
 strcpy(s1+strlen(s1),s2);
 return result;
}

※ で、ついでに strlen,strcpyも自作する、と。
    • good
    • 0

>>const char * restrict s2


>の最初が「const」になっている理由は何でしょうか・・・?

s2が指している部分はコピー元であるため、
そこの内容を改変しない、という意思を表明しています。
    • good
    • 0

>最後はreturn s1でも良いのでしょうか?


>ポインタを作らなければならないのでしょうか。

「ポインタを作る」とは何を意味しているのか補足にどうぞ。
また s1 は return するときに何を指しているのかも補足にどうぞ。


>あとwhile(*s1++ = *s2++);と while(*s1++);
>は色々間に省かれているような気がするのですが、それを省かずに
>表すとどうなるのでしょうか・・・?

省かれてはいません。
演算子の優先順位と ++ 演算子の前置と後置の違いについて復習しましょう。
    • good
    • 0

こんなところです。



char *strcat(char * restrict s1, const char * restrict s2)
{
 char *s = s1;

 while (*s1 != '\0') ++s1;
 while ((*s1 = *s2) != '\0') ++s1, ++s2;
 return s;
}
    • good
    • 0
この回答へのお礼

質問に回答していただき大変感謝しております。
大変恐縮ですが質問させていただくと、
>const char * restrict s2
の最初が「const」になっている理由は何でしょうか・・・?

それとwhile ((*s1 = *s2) != '\0')
は「s2の値にヌルが入るまでs2の値をs1の値に代入し続ける」という
ことなのでしょうか?

超初心者の大変低レベルな質問で申し訳ございません。

お礼日時:2009/05/04 22:21

こんにちは。



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文字ずつコピーしてもいいんですが…手抜きです(汗)
    • good
    • 0
この回答へのお礼

質問にお答えいただき大変感謝しております。

とりあえず特殊な関数を使わずに自作してみたいと思うのです。。
それとちょっと内容が自分にはレベル高すぎる気がします。(へタレですみません)

ですが大変参考になりました。ありがとうございます。

お礼日時:2009/05/04 22:08

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

この回答への補足

char *p = s1;
while(*s1++); /* s1を最後迄進める */
while(*s1++ = *s2++); /* s2をコピーする */
return p;

最後はreturn s1でも良いのでしょうか?
ポインタを作らなければならないのでしょうか。

あとwhile(*s1++ = *s2++);と while(*s1++);
は色々間に省かれているような気がするのですが、それを省かずに
表すとどうなるのでしょうか・・・?

補足日時:2009/05/04 22:01
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています