- ベストアンサー
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に慣れて自分で作れなくならないためにもお力をかしいただけると嬉しいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#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; 引かなくても良さそうな気が…。
その他の回答 (3)
- Trick--o--
- ベストアンサー率20% (413/2034)
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; }
お礼
早速の回答、ありがとうございます ためさせていただきます。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
2つの文字列の連結した文字数を求めるのに、実際に連結する必要はないと思います。 また、サイズを決めたバッファをそのようなサイズの判らない文字列の連結のための格納領域として使うのは危険です。 Cでの文字列は'\0'で終了するchar の配列ですから そのことが判っていればコピーも連結もできます。 文字列の長さは、'\0'が出現するまで数えれば良いです。
お礼
考え方の考察ありがとうございます。 参考にさせていただきます
- weiss09
- ベストアンサー率45% (20/44)
文字列配列の中に入ってるのは全部単なる“数値”であり、引数で文字列を渡す場合には、配列先頭のアドレスを渡してるということが分かれば、応用することができます。 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; };
お礼
ご解答ありがとうございます whileは使用したこと無かったんですがよくわかりました。 参考ページ紹介もありがとうございます。
お礼
ご解答ありがとうございます。 forを使う場合はこうすればよかったんですね。 助かりました