プロが教えるわが家の防犯対策術!

自分で色々考えていたのですが中々分からなくて・・・

#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に慣れて自分で作れなくならないためにもお力をかしいただけると嬉しいです。

A 回答 (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;
引かなくても良さそうな気が…。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/29 09:10

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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/29 09:08

2つの文字列の連結した文字数を求めるのに、実際に連結する必要はないと思います。


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

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

お礼日時:2006/09/29 09:09

文字列配列の中に入ってるのは全部単なる“数値”であり、引数で文字列を渡す場合には、配列先頭のアドレスを渡してるということが分かれば、応用することができます。



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;
};
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/29 09:11

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

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


このQ&Aを見た人がよく見るQ&A