C++のstrcat関数を使って文字列を連結する方法

このQ&Aのポイント
  • C++のstrcat関数は、指定した文字列を別の文字列に連結するための関数です。
  • 例えば、文字列xには「abcde」という文字列が格納されており、文字列yには「~」という文字列が格納されているとします。
  • strcat(p,y)は、指定した文字列pの末尾に文字列yを連結する操作を行います。
回答を見る
  • ベストアンサー

strcat(p,y)

#include <iostream.h> void main(){ char x[29]="abcde"; char* y="~"; for(char *p=x+1, i=0; i<15; i++,p+=2) { *p=(char)(i+49); // x[奇数] に数字文字を入れる strcat(p,y); // 数字文字の後ろにチルダを付ける } cout << x << endl << x[29] << endl << x[30]; } ↓出力結果 ------------------------------------- a1~2~3~4~5~6~7~8~9~:~;~<~=~>~?~ ? ~ ------------------------------------- 1回目に動作する strcat(p,y) の処理を教えてください。 strcat(p,y) の処理をされる前は、 x[0]='a' x[1]='b' x[2]='c' x[3]='d' x[4]='e' ... となっていると思います。 1回目の strcat(p,y) で、x[1]='b' x[2]='~' x[3]='\0' x[4]='e' ... となると思うんだけど、この考えは合っていますか?

  • A__
  • お礼率59% (194/328)

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

  • ベストアンサー
  • zonbie
  • ベストアンサー率27% (3/11)
回答No.3

初回strcatまでの流れはこんな感じです。 char x[29]="abcde";  ↓ x[0]='a' x[1]='b' x[2]='c' x[3]='d' x[4]='e' x[5]='\0' *p=(char)(i+49);  ↓ x[0]='a' x[1]='1' x[2]='c' x[3]='d' x[4]='e' x[5]='\0' strcat(p,y);   ↓ x[0]='a' x[1]='1' x[2]='c' x[3]='d' x[4]='e' x[5]='~' x[6]='\0'

A__
質問者

お礼

zonbieさんありがとう。 またお世話になりました。

その他の回答 (2)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

for文の初期化でp=&x[1]になっています。 1回目の*p=(char)(i+49)は *p = '1' ; ↑x[1]と等価 ですね。 よって、1回目のstrcat()は "a1cde"と"~"の連結です。 結果として"a1cde~"となり、御希望の結果は得られません。 当然、ループ中にxは29個では足りなくなり(元々足りませんが)「不正アクセス」で落ちるでしょう。 また、main()はint型の値を返すことが言語規約上決まっているのでvoidと宣言するのは間違いです。

  • haru-p
  • ベストアンサー率28% (34/119)
回答No.1

なんか物凄いプログラムですね。 > 1回目の strcat(p,y) で、x[1]='b' x[2]='~' x[3]='\0' x[4]='e' ... > となると思うんだけど、この考えは合っていますか? 1回目は p が z+1 されていますから、 x[0]='a' x[1]='1'←ここに "=(char)(i+49)" このコードが入る x[2]='c' x[3]='d' x[4]='e' x[5]='~' x[6]=0 ですね。 strcat() は文字列の一番後ろに文字列を加える関数です。 なので strcat() を使わずに、 for(char *p=x+1, i=0; i<15; i++,p+=2) { p[0]=(char)(i+49); p[1]=(char)'~'; } です(下記)。 x[0]='a' x[1]='1' x[2]='~' x[3]='d' x[4]='e' x[5]=0

関連するQ&A

  • strcat で型が合わない

    #include <iostream.h> main(){ char x[15]; for(int i=0;i<15;i++) x[i]=i+49; for(int i=0;i<15;i++){ cout <<x[i]; }; } 9より先の文字化けは考えないとして、 char x[15]; というのは適切ですか? 16個目の要素になる x[15] には、文字列の最後の \0 が入ると思って char x[14]; にしなかったんです。 コンパイルして実行すると 123456789... となるけど、 2桁にしたいんです。半角スペースを使いたいんです。 1 2 3 4 5... のようにしたいんです。 そのように表示する方法は色々あるけど、 文字列の配列でやる場合の方法が知りたいんです。 #include <iostream.h> main(){ char x[15]; char y=" " for(int i=0;i<15;i++){ x[i]=strcat( y,(char)(i+49) ); }; for(int i=0;i<15;i++){ cout <<x[i]; }; } ↑のようなことやってみたけど、型が合わないとかで うまくできませんでした。 strcat とか strncpy は難しいです。 正しいソースを教えてください。

  • 下記、プログラム内の「char *」の役割

    C++初心者です。 縦長になってしまいますが、 『 #include <iostream.h> void show(int); void show(double); void show(char *);   ←左記の記述の使い方 int main(void) { show(1); show(0.25); show("文字列"); return 0; } void show(int x) { cout << x << endl; } void show(double y) { cout << y << endl; } void show(char *z) { cout << z << endl; } 』 のプログラムにおいて、「char *」の使い方がいまいち理解できません。 上記プログラムですとエラーが表示されないのですが、下記のプログラムだとエラーが発生します。 『 #include <iostream.h> void show(int); void show(double); void show(char);   //←---------上記と違う行 int main(void) { show(1); show(0.25); show("文字列"); return 0; } void show(int x) { cout << x << endl; } void show(double y) { cout << y << endl; } void show(char z) {  //←---------上記と違う行 cout << z << endl; } 』 なぜ、ポインタ(*)を付けないといけないのか分かりやすく教えていただけましょうか。

  • char型変数のアドレスを coutで表示するには

    #include <iostream> using namespace std; int main() { bool b; int i; short s; long l; float f; double d; char c; //上で宣言した変数のアドレスを表示 cout << "bool &b " << &b << endl; cout << "int &i " << &i << endl; cout << "short &s " << &s << endl; cout << "long &l " << &l << endl; cout << "float &f " << &f << endl; cout << "double &d " << &d << endl; cout << "char &c " << &c << endl; //「char &c 」とのみ表示される cout << '\n'; //char型のみ printf で再表示 printf("char &c %p\n", &c); //「char &c ********」と表示される return 0; } 上のプログラムを実行すると cout << "char &c " << &c << endl; のところだけ、アドレスが表示されません。 printfを使えば、char型の変数のアドレスも表示されるのですが…。 coutを使ってchar型のアドレスを表示させるにはどうすればいいのでしょうか。 よろしくお願いします。

  • strcat関数

    学校の課題で strcat関数と全く同じ働きをするmy_strcatを実装せよ という課題がでています。 strcatは char* strcat(char *dest, const char *str) で表され、文字列 strを文字列 dest に合成して 合成された新しい文字列として dest を返します。 例えば、dest = Japan, str = Korea だったら, 関数処理後に、 dest = JapanKorea を戻り値とします。 ********************************************* my_strcat実装について 実装段階で一番の問題になるのが、文字列のサイズです。 とりあえず、私の書いたコードを示します↓ char* my_strcat(char *dest, const char *src) { int i=0; int j=0; while(*dest) { dest++; i++; } while(*src) { *(dest+i) = src[0]; i++; src++; } *(dest+j) = src[0]; //put null at the end of dest return dest; } 試しにdest=Japan,str=Koreaでやってみたのですが、動きませんでした。 原因はdest の文字サイズを無視した無理やりなりな実装だと考えます。 C言語では文字のサイズを一度宣言したら、変えられないと思うので、困っています。 どなたかアドバイスをいただけないでしょうか。 よろしくお願いします

  • strcatの処理方法

    #include <iostream.h> #include <string.h> int main(){char a[]="a";char b[]="b"; char c[]="c"; for(int d=0;d<3;d++){strcat(a,b); strcat(a,c);cout<<a;}} このc言語プログラムの実行結果を、abcbcbc したいのですが、例外処理されます。解決方法お願いします。後、又簡単な連結方法教えてください。

  • C++の関数

    関数の課題が出たんですが分からないので教えてください。 第1引数と第2引数はchar型の1元配列であり、これら2つの配列(文字列)を連続して表示する関数catstringがあるものとする。 ただし第2引数にはデフォルトの文字列"あいうえお"が設定されている。main関数からキーボード入力で2つの文字列を取得し、 catstringの第1引数のみに文字列が渡される場合と第1、2引数ともに文字列が与えられるプログラムを作成せよ。 やってみましたがエラーが出てしまいます。 #include <iostream> #include <cstdlib> using namespace std; char catstring(char,char="あいうえお"); int main() { char a,b; cin>>a; cin>>b; cout<<catstring(a)<<endl; cout<<catstring(a,b)<<endl; return EXIT_SUCCESS; } char catstring(char x,char y) { char s; s=x+y; return(s); }

  • 自作strcat

    関数strcatを自分で作ってみました。 #include<stdio.h> char *my_strcat(char *s1, char *s2){ int i = 0; int n = 0; while(s1[i] != '\0'){ i++; } while(s2[n] != '\0'){ s1[i] = s2[n]; i++; n++; } s1[i] = '\0'; return s1; } int main(){ char *s1 = "abc"; char *s2 = "vwxyz"; my_strcat(s1, s2); printf("s1:%s s2:%s\n", s1, s2); return 0; } これを実行したところ、s1はちゃんとs1にs2を連結した形で表示されました。しかし、s2は一文字少なく表示されてしまいます。自分ではどこをどう直せばいいかわかりません。よろしくお願いします。

  • char型配列について

    基本的なことですが、 char str[5]="Hello"; --> str[0]='H' str[1]='e' str[2]='l' str[3]='l' str[4]='o' str[5]='\0' では、ないのでしょうか? エラーが出ます。 //error C2117: 'str' : 指定された配列には、初期化子が多すぎます。 char str[6]="Hello"; では、コンパイルできます。 ---------------------------------- また、 #include<iostream> using namespace std; int main() { char str[6]="Hello"; cout << str << endl; for(int i=0;i<7;i++) { cout << "i=" << str[i]; if(str[i]=='\0'){cout << " NULL" << endl;} else{cout << endl;} } getchar();return 0; } ----------------------------------------------- とすると、 Hello i=H i=e i=l i=l i=o i= NULL <--ここで、NULLなら、 i=フ <--このぶんは、いらないと思うのですが、、、 となります。 str[6] i=6 は、何を意味するのでしょうか? Visual C++ NET を使用しています。 よろしくお願いします。

  • 自作のstrcatが動かない件

    お世話になります。 Wikiペディアに掲載されていたstrcatの実装例(http://ja.wikipedia.org/wiki/Strcat#.E5.AE.9F.E8.A3.85.E4.BE.8B)をそのまま使って、 mystrcatを作ってみましたが、結果が空白になってしまいます。 [ソース] #include <stdio.h> #include <string.h> #include <stdlib.h> char *mystrcat(char *s1, const char *s2) { char *p = s1; while(*s1++); while(*s1++ = *s2++); return p; } void main(){ char *dst; char *p;; char *src1 = "Hello"; char *src2 = "World"; dst = malloc(strlen(src1)+strlen(src2)+1); printf("%s\n",mystrcat(dst,src1)); printf("%s\n",mystrcat(dst,src2)); free(dst); } [実行結果] 空白2行 [期待していた動作] Hello HelloWorld 何が間違っているのか教えていただけると助かります。 標準のstrcatを使うとHelloとHelloWorldが表示されます。 よろしくお願いします。

  • プログラムの動作

    10文字をスキップするプログラムなのですが、どのようにスキップしているのかわからないので教えてください。 下にソースコードを書きます。 #include <iostream> using namespace std; //10文字をスキップする istream &skipchar(istream &stream) { int i; char c; for(i=0; i<10; i++)stream >> c; return stream; } int main() { char str[80]; cout << "いくつかの文字を入力する:"; cin >> skipchar >> str; cout << str << endl; return 0; } よろしくおねがいします。

専門家に質問してみよう