プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (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); ・・・ってかくべきなんですが
あれ、私、ぼけてました。この行いりません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/03/23 00:10

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

教えてくれたソースはとても難しかったから半分ぐらいしか
分からなかったけど、分かるようになりたいと思いました。
ありがとうございます。

補足日時:2001/03/19 01:38
    • good
    • 0

あれ?違うや



#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;
}
こうか。
    • good
    • 0

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;
}
    • good
    • 0

エラーの原因をつきとめるところから始めてみましょう。


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;

とした方がよいでしょう。
    • good
    • 0
この回答へのお礼

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

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

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

教えてくれたソースは理解できました。
最後の x[29] = '\0'; で、出力が cout << x;
というふうに簡単になるところが気に入りました。
ありがとうございます。

お礼日時:2001/03/19 00:56

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++] = ??????; /* スペースを入れる */
}
同じ意味を持つ数値は名前を付けたほうが間違いが無いです。
??? の部分は考えてください。
    • good
    • 0

絶対に、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];
}

}
    • good
    • 0

まず、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() )
というコンパイルエラーでした。

補足日時:2001/03/18 01:46
    • good
    • 0

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