- ベストアンサー
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 は難しいです。 正しいソースを教えてください。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
あれ?違うや #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)
- 春原 なの(@ymda)
- ベストアンサー率37% (668/1777)
>main の次の行は char x[14]; の方がいいということですか? 厳密には、「16文字」(0から15の)入るのであれば、\0 が入ると 17文字入ります。なので・・・ char x[17]; でないといけません。 >のソースで、bcc5.5でコンパイルしようとすると >y = malloc(1024); >の行が 'void *' 型は 'char *' 型に変換できない(関数 main() ) >というコンパイルエラーでした。 y = (char *)malloc(1024); ・・・ってかくべきなんですが あれ、私、ぼけてました。この行いりません。
- kokucho81
- ベストアンサー率61% (157/255)
1個配列足りてないから、この手抜きはダメだなこりゃ。
補足
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)
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)
エラーの原因をつきとめるところから始めてみましょう。 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; とした方がよいでしょう。
お礼
"文字" と '文字' の違いを知りませんでした。 やっと分かったところです。 for に {} を使った場合に {} の次に ; は不用だということも 今知りました。 質問文に書いた2つめの for は元々 {} は不用だったことも 今気付きました。 教えてくれたソースは理解できました。 最後の x[29] = '\0'; で、出力が cout << x; というふうに簡単になるところが気に入りました。 ありがとうございます。
- shigatsu
- ベストアンサー率26% (511/1924)
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)
絶対に、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]; } }
- 春原 なの(@ymda)
- ベストアンサー率37% (668/1777)
まず、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); } }
補足
ありがとうございます。 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() ) というコンパイルエラーでした。
お礼
コンパイルできなかったけど、情報ありがとうございました。