#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.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.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.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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
strchr() の第2引数はなぜ int ...
-
CStringをwchar_tに変換したい
-
_TCHAR*での引数の読み込み
-
間接操作のレベルとは
-
fgetsなどのときのstdinのバッ...
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
ftoa の作り方
-
標準ライブラリ関数の自作につ...
-
c言語です。
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
構造体のアライメント調整
-
間接参照のレベルが異なっています
-
文字列から空白を取り除きたい...
-
起動時の引数の取得方法が分か...
-
コマンドラインに入力されてい...
-
配列をnビットシフトする
-
RGB→YUV変換のプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報