• ベストアンサー

str系関数を使わずに二つの文字を結合する方法

自分で色々考えていたのですが中々分からなくて・・・ #include<stdio.h> #include<string.h> int moji(char* b1,char *b2) { char b[11]; int x; strcpy(b, b1); strcat(b, b2); x = strlen(b); return x; } main() { char a[4] = "alt"; char b[8] = "recorde"; int c; c = moji(a, b); printf("文字数は%d\n", c); } のプログラムでmoji関数の部分にあるstr~を全部接続節(for)等で作成してポイントで持ってきた文字を連結するにはどうすればいいでしょうか? strに慣れて自分で作れなくならないためにもお力をかしいただけると嬉しいです。

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

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

#1の回答と似たようなものですが、 -------------------------------- int moji(char *b1, char *b2) {   char b[256];   int cnt=0;   for(; *b1 != '\0'; b1++){     b[cnt] = *b1;     cnt++;   }   for(; *b2 != '\0'; b2++){     b[cnt] = *b2;     cnt++;   }   b[cnt] = '\0';   printf("%s\n", b);  /*チェック用*/   return cnt; } -------------------------------- 文字数だけ欲しいなら、連結しなくてもそれぞれ文字数数えて足せばいいけど、 それは質問の趣旨に反するんでしょうね^^; > #1 > }; whileブロックの終わりと、関数ブロックの終わりにセミコロンが有りますが、これは不必要ですよ。 空文になるので、この場合有っても実害はないかな。 > while(TRUE) どこかでdefineしていない限り、TRUEという定数はないと思います。(C++ならtrueは有る。) 無限ループはwhile(1)で。 (b1[x]をループ継続条件にしても良さそう。) > return y-1; 引かなくても良さそうな気が…。

kyana_no
質問者

お礼

ご解答ありがとうございます。 forを使う場合はこうすればよかったんですね。 助かりました

その他の回答 (3)

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.4

http://www9.plala.or.jp/sgwr-t/lib/sprintf.html sprintfの戻り値は、文字数。 int moji(char* b1, char* b2) {  char b[MAX_LEN+1];  int x;  x = sprintf(b,"%s%s",b1,b2);  return x; }

kyana_no
質問者

お礼

早速の回答、ありがとうございます ためさせていただきます。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

2つの文字列の連結した文字数を求めるのに、実際に連結する必要はないと思います。 また、サイズを決めたバッファをそのようなサイズの判らない文字列の連結のための格納領域として使うのは危険です。 Cでの文字列は'\0'で終了するchar の配列ですから そのことが判っていればコピーも連結もできます。 文字列の長さは、'\0'が出現するまで数えれば良いです。

kyana_no
質問者

お礼

考え方の考察ありがとうございます。 参考にさせていただきます

  • weiss09
  • ベストアンサー率45% (20/44)
回答No.1

文字列配列の中に入ってるのは全部単なる“数値”であり、引数で文字列を渡す場合には、配列先頭のアドレスを渡してるということが分かれば、応用することができます。 int moji(char* b1,char *b2) {  char b[256]; // 十分な長さの配列を確保(文字列長を得てから確保した方が良い)  int x=0; // ループカウンタ  int y=0; // b配列の文字位置  while(TRUE){ // forとstrlenで書き換え可能   if(!b1[x]){break;} // NULLならループを抜ける   b[y]=b1[x];   x++;   y++;  };  x=0;  while(TRUE){   if(!b2[x]){break;} // NULLならループを抜ける   b[y]=b2[x];   x++;   y++;  };  b[y]=0; // NULLを付加  return y-1; };

kyana_no
質問者

お礼

ご解答ありがとうございます whileは使用したこと無かったんですがよくわかりました。 参考ページ紹介もありがとうございます。

関連するQ&A