#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 は難しいです。
正しいソースを教えてください。
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;
}
こうか。
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); ・・・ってかくべきなんですが
あれ、私、ぼけてました。この行いりません。
No.7
- 回答日時:
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個配列足りてない というのはどういうことですか?
問題なさそうでしたよ。
教えてくれたソースはとても難しかったから半分ぐらいしか
分からなかったけど、分かるようになりたいと思いました。
ありがとうございます。
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;
}
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;
とした方がよいでしょう。
"文字" と '文字' の違いを知りませんでした。
やっと分かったところです。
for に {} を使った場合に {} の次に ; は不用だということも
今知りました。
質問文に書いた2つめの for は元々 {} は不用だったことも
今気付きました。
教えてくれたソースは理解できました。
最後の x[29] = '\0'; で、出力が cout << x;
というふうに簡単になるところが気に入りました。
ありがとうございます。
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++] = ??????; /* スペースを入れる */
}
同じ意味を持つ数値は名前を付けたほうが間違いが無いです。
??? の部分は考えてください。
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);
}
}
この回答への補足
ありがとうございます。
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#からC言語で作成したDLLに文...
-
-'0'の意味について
-
fgetsなどのときのstdinのバッ...
-
入力された文字列から整数だけ...
-
文字列から空白を取り除きたい...
-
プログラムの関数化
-
Cで部分配列
-
RGB→YUV変換のプログラム
-
データの取得をしたいのですが…
-
プログラミング(関数reverseを...
-
ftoa の作り方
-
'const char *' 型は 'char *' ...
-
int型変数をchar型変数に格納す...
-
C言語の式を教えて頂きたいの...
-
c++ 文字列を入力して、一文字...
-
const unsigned char *Ptn
-
charからLPTSTRへの変換方法
-
main の引数には const 付けた方が
-
間接操作のレベルとは
-
char型からのバイト数取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
CStringをwchar_tに変換したい
-
charでの計算?
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
'const char *' 型は 'char *' ...
-
テキストデータをそのままバイ...
-
配列をnビットシフトする
-
半角カナ→16進
-
double型の値をchar配列に変換...
-
sprintfに同じ変数は使えるか
-
ファイル名である文字列からbas...
-
ネットワークにつながっている...
-
ftoa の作り方
-
間接操作のレベルとは
-
型変換
-
C言語です
-
C言語のfor文です。 繰り返しの...
-
Win32APIでのエディットボック...
-
【C言語】文字型と整数型の違い
おすすめ情報