• ベストアンサー

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 は難しいです。 正しいソースを教えてください。

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

  • ベストアンサー
  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.6

あれ?違うや #include <iostream.h> #include <string.h> #define LENGTH 15 void main(){ char x[LENGTH * 2]=""; char* y=" "; for(char *p=x, i=0; i<LENGTH; i++,p+=2) { *p=(char)(i+49); strcat(p,y); } cout << x; } こうか。

その他の回答 (7)

回答No.8

>main の次の行は char x[14]; の方がいいということですか? 厳密には、「16文字」(0から15の)入るのであれば、\0 が入ると 17文字入ります。なので・・・ char x[17]; でないといけません。 >のソースで、bcc5.5でコンパイルしようとすると >y = malloc(1024); >の行が 'void *' 型は 'char *' 型に変換できない(関数 main() ) >というコンパイルエラーでした。 y = (char *)malloc(1024); ・・・ってかくべきなんですが あれ、私、ぼけてました。この行いりません。

A__
質問者

お礼

コンパイルできなかったけど、情報ありがとうございました。

  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.7

1個配列足りてないから、この手抜きはダメだなこりゃ。

A__
質問者

補足

1 の左にもスペースを入れたかったから少し変えました。 別の話だけど、ここの書き込みで1文字目に半角スペースを 表示するのは難しそうだ。 #include <iostream.h> void main(){ char x[30]=" "; char* y=" "; for(char *p=x+1, i=0; i<15; i++,p+=2) { *p=(char)(i+49); // 数字文字を入れる strcat(p,y); // 数字文字の後ろに半角スペースを付ける } // x[28] は char 64 が入っている。x[29] は半角スペース cout << x; } これより下に書いてあるソースはどれも #include <string.h> というのは無くてもいいみたいでした。 1個配列足りてない というのはどういうことですか? 問題なさそうでしたよ。 教えてくれたソースはとても難しかったから半分ぐらいしか 分からなかったけど、分かるようになりたいと思いました。 ありがとうございます。

  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.5

strcat は使いたい、 今の感じに似せたい、 ぜひ配列も使いたい、 ということであれば、こうかな~。 #include <iostream.h> #include <string.h> #define LENGTH 15 void main(){ char x[LENGTH * 2]=""; char* y=" "; for(int i=0; i<LENGTH; i+=2) { x[i]=(char)(i+49); strcat(x,y); } cout << x; }

  • misoka
  • ベストアンサー率35% (56/160)
回答No.4

エラーの原因をつきとめるところから始めてみましょう。 1 strcatは、文字列を返しますので、x[i]には代入できませんよね?  x[i]はchar*ではなく、charですから、  char*であるstrcatの戻り値を受け取れないというわけです。 2 strcatの引数は文字列ですので、(char)(i+49) を引数にするのは  ムリではないでしょうか? 3 ちょっとしたケアレスミスと思いますが、char y=" ";というのは、  ムリです。(" "には'\0'がついてきます) 4 これもケアレスミスと思いますが、for文のブロックの終わりには、  ;は不要。 単純で分かりよい書き方だとこんな感じになるんじゃないかな? と思います。 --------------------------------- char x[30]; int j = 0; for( int i = 0; i < 15; i++ ) {  x[j] = ( char )( i + 49 );  x[j + 1] = ' ';  j += 2; } x[29] = '\0'; 最後の文は、forループで1バイトずつ出力するなら 要りませんが、基本的にはヌル文字を含む文字列として 扱う方が、間違いがないと思います。 だから、x[29] = '\0' として、出力は(ループせずに) cout << x; とした方がよいでしょう。

A__
質問者

お礼

"文字" と '文字' の違いを知りませんでした。 やっと分かったところです。 for に {} を使った場合に {} の次に ; は不用だということも 今知りました。 質問文に書いた2つめの for は元々 {} は不用だったことも 今気付きました。 教えてくれたソースは理解できました。 最後の x[29] = '\0'; で、出力が cout << x; というふうに簡単になるところが気に入りました。 ありがとうございます。

  • shigatsu
  • ベストアンサー率26% (511/1924)
回答No.3

char 型の変数ならダブルクォートじゃなくてシングルクォートじゃないでしょうか? char y=' '; で、xという配列は15しか要素数が無いので、文字を15個入れたら、 y を入れる隙間は無いですよね? もし入れるとしたら、14増やした29で配列を確保する必要が有ると思います。 それとstrcatだとどんどんyに追加していってしまいますので、領域確保されていないためヘンなところに書き込んじゃいますね。 全て配列でやるのであれば、strcatなどの文字列処理関数は使わないほうがいいですね。それと配列の要素を1つずつ出力するなら最後の \0 も必要ないでしょう。 #define MAXSIZE 29 char x[MAXSIZE]; for(i=0; i<MAXSIZE; ) { x[i++] = ??????; /* 文字を入れる */ x[i++] = ??????; /* スペースを入れる */ } 同じ意味を持つ数値は名前を付けたほうが間違いが無いです。 ??? の部分は考えてください。

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

絶対に、x[i] には1文字しか入らないのを理解して下さい。 質問のソースでは、x[i] の中に「半角スペース」と「i+49]と 「\0」を入れようとしてますよね。 すると、 x[0] →「半角スペース」 x[1] →i+49 x[2] →'\0' になってしまうので、ひとつのやり方として 2次元配列を使ってみます。 #include <iostream.h> #include <string.h> void main(){ char x[16][3]; char y[3]; int i; for(i=0;i<15;i++){ strcpy(y," "); x[i][0] = (char)(i+49); x[i][1] = '\0'; strcat( y, &x[i][0]); strcpy(&x[i][0],y); } for(i=0;i<15;i++){ cout << &x[i][0]; } }

回答No.1

まず、char x[15] が定義された場合 x[0]からx[14] までが使用できるようになります。 x[15] は、使えません。 x[i] は char型ですので、1バイトになります。 そして、i は、(宣言されてませんね?)は、int型となりますので 一般的な32bitCPUでは、4バイトになります。 ですので、このようなことがおきます。 char x[15]; for(int i=0;i<15;i++) x[i]=i+49; の場合・・・ i = 14 の場合 x[14] = (char)(14 + 49) x[15] = (char)0 x[16] = (char)0 x[17] = (char)0 ということになります。(注:自動キャスト変換されている場合はなりません) #include <stdio.h> int main(void) { char x[15]; char *y = " "; /* 2文字スペース+\0 */ int i; y = malloc(1024); /* メモリ確保 */ for (i = 0; i < 15; i++) { sprintf(y, "%2c", i + 49); printf("%s", y); } }

A__
質問者

補足

ありがとうございます。 main の次の行は char x[14]; の方がいいということですか? #include <iostream.h> #include <stdio.h> int main(void) { char x[15]; char *y = " "; /* 2文字スペース+\0 */ int i; y = malloc(1024); /* メモリ確保 */ for (i = 0; i < 15; i++) { sprintf(y, "%2c", i + 49); printf("%s", y); } } のソースで、bcc5.5でコンパイルしようとすると y = malloc(1024); の行が 'void *' 型は 'char *' 型に変換できない(関数 main() ) というコンパイルエラーでした。

関連するQ&A

専門家に質問してみよう