-PR-
解決
済み

strcat で型が合わない

  • 暇なときにでも
  • 質問No.53067
  • 閲覧数271
  • ありがとう数4
  • 気になる数0
  • 回答数8
  • コメント数0

お礼率 59% (194/328)

#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
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.6
レベル11

ベストアンサー率 61% (157/255)

あれ?違うや

#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;
}
こうか。
-PR-
-PR-

その他の回答 (全7件)

  • 回答No.3
レベル13

ベストアンサー率 26% (511/1924)

char 型の変数ならダブルクォートじゃなくてシングルクォートじゃないでしょうか? char y=' '; で、xという配列は15しか要素数が無いので、文字を15個入れたら、 y を入れる隙間は無いですよね? もし入れるとしたら、14増やした29で配列を確保する必要が有ると思います。 それとstrcatだとどんどんyに追加していってしまいますので、領域確保されていないためヘ ...続きを読む
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++] = ??????; /* スペースを入れる */
}
同じ意味を持つ数値は名前を付けたほうが間違いが無いです。
??? の部分は考えてください。


  • 回答No.2
レベル6

ベストアンサー率 27% (3/11)

絶対に、x[i] には1文字しか入らないのを理解して下さい。 質問のソースでは、x[i] の中に「半角スペース」と「i+49]と 「\0」を入れようとしてますよね。 すると、 x[0] →「半角スペース」 x[1] →i+49 x[2] →'\0' になってしまうので、ひとつのやり方として 2次元配列を使ってみます。 #include <iostream.h ...続きを読む
絶対に、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.8

アドバイザー 詳しい分野:いろいろ

レベル14

ベストアンサー率 37% (668/1777)

>main の次の行は char x[14]; の方がいいということですか? 厳密には、「16文字」(0から15の)入るのであれば、\0 が入ると 17文字入ります。なので・・・ char x[17]; でないといけません。 >のソースで、bcc5.5でコンパイルしようとすると >y = malloc(1024); >の行が 'void * ...続きを読む
>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__

お礼率 59% (194/328)

コンパイルできなかったけど、情報ありがとうございました。
投稿日時 - 2001-03-23 00:10:12
  • 回答No.4
レベル10

ベストアンサー率 35% (56/160)

エラーの原因をつきとめるところから始めてみましょう。 1 strcatは、文字列を返しますので、x[i]には代入できませんよね?  x[i]はchar*ではなく、charですから、  char*であるstrcatの戻り値を受け取れないというわけです。 2 strcatの引数は文字列ですので、(char)(i+49) を引数にするのは  ムリではないでしょうか? 3 ちょっとしたケアレスミスと思 ...続きを読む
エラーの原因をつきとめるところから始めてみましょう。
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__

お礼率 59% (194/328)

"文字" と '文字' の違いを知りませんでした。
やっと分かったところです。

for に {} を使った場合に {} の次に ; は不用だということも
今知りました。

質問文に書いた2つめの for は元々 {} は不用だったことも
今気付きました。

教えてくれたソースは理解できました。
最後の x[29] = '\0'; で、出力が cout << x;
というふうに簡単になるところが気に入りました。
ありがとうございます。
投稿日時 - 2001-03-19 00:56:25
  • 回答No.1

アドバイザー 詳しい分野:いろいろ

レベル14

ベストアンサー率 37% (668/1777)

まず、char x[15] が定義された場合 x[0]からx[14] までが使用できるようになります。 x[15] は、使えません。 x[i] は char型ですので、1バイトになります。 そして、i は、(宣言されてませんね?)は、int型となりますので 一般的な32bitCPUでは、4バイトになります。 ですので、このようなことがおきます。 char x[15]; for ...続きを読む
まず、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__

お礼率 59% (194/328)

ありがとうございます。
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() )
というコンパイルエラーでした。
投稿日時 - 2001-03-18 01:46:18
  • 回答No.5
レベル11

ベストアンサー率 61% (157/255)

strcat は使いたい、 今の感じに似せたい、 ぜひ配列も使いたい、 ということであれば、こうかな~。 #include <iostream.h> #include <string.h> #define LENGTH 15 void main(){ char x[LENGTH * 2]=""; char* y=" ...続きを読む
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;
}
  • 回答No.7
レベル11

ベストアンサー率 61% (157/255)

1個配列足りてないから、この手抜きはダメだなこりゃ。 ...続きを読む
1個配列足りてないから、この手抜きはダメだなこりゃ。
補足コメント
A__

お礼率 59% (194/328)

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個配列足りてない というのはどういうことですか?
問題なさそうでしたよ。

教えてくれたソースはとても難しかったから半分ぐらいしか
分からなかったけど、分かるようになりたいと思いました。
ありがとうございます。
投稿日時 - 2001-03-19 01:38:12
このQ&Aのテーマ
このQ&Aで解決しましたか?
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ