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

このQ&Aに関連する最新のQ&A

A 回答 (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;
}
こうか。
    • good
    • 0

>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

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に関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qソフトバンクの松田選手は癖でよく目をつぶっていますが照明等がまぶしいか

ソフトバンクの松田選手は癖でよく目をつぶっていますが照明等がまぶしいからでしょうか?

わかるかたお願いします。

Aベストアンサー

照明に関係なく、まばたきはご本人の癖みたいですよ。
緊張すると出やすいタイプなのかもしれませんよね☆

Qchar AA[]{"全角文字"};から"全"という一字を取り出したい

 今晩は、Cの初心者です、宜しくお願いします。
 全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。
 どのようにしたら取り出せるのでしょう。
 ポインタを使う方法と使わない方法を教えて下さい。
 宜しくお願いします。

Aベストアンサー

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出す必要があります。

>char AA[]={'全','角'};

char AA[]="全角";
とし
>printf("%s%s\n" , AA[0],AA[1] ) ;

printf("%c%c\n" , AA[0],AA[1] ) ;
とすれば、「全」だけを表示する事が可能と思われます。

日本語を文字列で表示する為の文字コードについては
Shift-JISだけでなく、UnicodeやUTF・EUC・JISなどがあります。

もう少し詳しく記載してあるホームページはないか探してみましたが、ちょっと無理でした。

参考URL:http://marupeke296.com/CPP_charUnicodeWideChar.html

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出...続きを読む

Qパソコンの画面がまぶしい どこをいじればよいのでしょうか?

パソコンの画面がまぶしくて仕方ありません。
XPなのですが、どこをいじればまぶしくなくなりますか?
アドバイスお願いします。

Aベストアンサー

私は、Fnを押しながら、 F6を トントントン と叩いて調節してます。

Qchar gyou[1024];でcharの表現範囲は-128~127間でと!gyou[1024]の

#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
char gyou[1024];
int gyousuu = 0;
if ( argc < 2 ){
printf("file mei ga nai\n");
return -1;
}
fp = fopen(argv[1], "r");
if ( fp == NULL ){
printf("fopen dekinai\n");
return -2;
}
while(fgets(gyou, sizeof(gyou), fp) != NULL){
gyousuu++;
}
fclose(fp);
printf("gyousuu=%d\n", gyousuu);
return 0;
}
 以上のプログラムは行数を計算してくれるプログラムです。
  計算結果が
  gyousuu=22 とでます。
 さて、char gyou[1024];でcharの表現範囲は-128~127間ですが、
 gyou[1024]の[1024]とは関係はありますでしょうか!?
  [1024]の意味は”要素数”と参考書に鉛筆書きがありました。
 charの表現範囲である1024は、はるかに超えているみたいですが?
  dharの表現範囲を1024が超えたとしても特に問題はなさそうです!
  このプログラムは動いていますのでは正常です。
  私の
  考え方としまして、何か誤りがありますでしょうか?
  よろしくお願いいたします。

#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
char gyou[1024];
int gyousuu = 0;
if ( argc < 2 ){
printf("file mei ga nai\n");
return -1;
}
fp = fopen(argv[1], "r");
if ( fp == NULL ){
printf("fopen dekinai\n");
return -2;
}
while(fgets(gyou, sizeof(gyou), fp) != NULL){
gyousuu++;
}
fclose(fp);
printf("gyousuu=%d\n", gyousuu);
return 0;
}
 以上のプログラムは行数を計算してくれるプログラムです。
  計算結果が
...続きを読む

Aベストアンサー

> さて、char gyou[1024];でcharの表現範囲は-128~127間ですが、
> gyou[1024]の[1024]とは関係はありますでしょうか!?
ない。
1024 のほうはただ単に領域の個数を表しているだけで、読み込もうとするファイルの 1 行のバイト数がこれを超えない限り別に 1000 でも 3327 でも構わない(ある程度以上大きくなると別の問題が出てくるが)。
ただ単に 1024 = 2^10 でプログラマにはよく見る数字、かつ、普通のテキストなら 1 行が収まりそうな長さなだけ。

Q目が痛い、しみる、まぶしい オススメ目薬

ここ1~2ヶ月前から目の奥の方が痛かったり、外に出ると眩しくて風に当たるとしみたりします。右目だけです。最近は時々だった痛みがずっと続くようになり、先日眼科に行ったのですが何の問題もなく特に薬も出なかったのですが、しみるのと痛みでまぶたが開いてるような空いてないような違和感が出てきました。
市販の目薬でオススメがありましたら教えてください。よろしくお願いします。

Aベストアンサー

こんばんは

違う眼科で見てもらう方がいいですよ

Qchar *name1[4] とchar name2[][4] の違いについて

C言語のことで質問があります。

char *name1[4]は
char *name1[4] = {"abcdefghi","jkl","l","mn"};
と宣言でき,ポインタを4つ確保した形となりました。

char name2[][4]は
char name2[][4] = {"abc","def","ghi","jkl","mno","pqr","stu","vwx"};
と4文字以内の文字列を初期化した数だけ確保した形となりました。

この結果からchar *name1[4]の意味は,char name2[][4]ではなくchar name2[4][]に近いと思いました。
しかし,char name2[4][]ではポインタを4つ確保した事にはならないみたいでコンパイルが通りません。
*name1[4]では4つのポインタを確保できるのに~と思ってしまいます。

ポインタと配列は別物と考えるべきなのでしょうか?
訳の分からない質問かもしれませんが,
何卒ご指導いただくようよろしくお願いします。

Aベストアンサー

ポインタと配列の違いというのは、変数と定数の違いのようなものです。

話を簡単にするために、一次元配列から考えましょう。

char *p1; と定義した時のp1は、いうまでもなくポインタで、
これは変数です。p1は任意の文字列を指すことができます。
char a1[4]; と配列の形で定義した場合のa1については、
a1[0]やa1[1]等を、通常のchar型の変数と全く同じように扱うことが
できます。しかし、a1自体は、例えば a1 = p1; のように値を代入する
ことができません。(逆の p1 = a1; は可能。)つまり、この場合のa1は、
変数ではなく、定数のようなものなのです。

複合的なケースについて見てみましょう。
char **q1; ポインタへのポインタ
 q1,*q1,**q1,q1[0],*q1[0],q1[0][0] のいずれも変数として
 扱うことができます。(値を代入することが文法的に許されます。
 ただし、実行時にはアクセス違反になる場合もあります。)
char q2[4][4]; 二次元配列
 q2,q2[0]は変数として扱うことができません。q2[0][0]のように
 して、初めて変数として扱えるようになります。
char *q3[4]; ポインタの配列
 q3は変数として扱うことができませんが、q3[0],*q3[0],q3[0][0]
 はいずれも変数として扱うことができます。
 なお、この定義は char *(q3[4]); とした場合と全く同じ意味です。
char (*q4)[4]; 配列へのポインタ
 q4,(*q4)[0],q4[0][0]はいずれも変数として扱うことができます。
 しかし、*q4,q4[0]は変数として扱うことができません。

char *name1[4]; と char name2[4][]; は確かに似ています。しかし
違うところもあります。それは、name1[0] が変数として扱えるのに
対し、name2[0] には値を代入できないという点です。(データの
具体的な構造については、inthefloiさんが書いておられる通りです。
> char name2[4][]ではポインタを4つ確保した事にはならないみたい
というのも、全くその通りで、配列の定義では、ポインタ変数の領域
を確保する余地はないのです。

ポインタと配列の違いというのは、変数と定数の違いのようなものです。

話を簡単にするために、一次元配列から考えましょう。

char *p1; と定義した時のp1は、いうまでもなくポインタで、
これは変数です。p1は任意の文字列を指すことができます。
char a1[4]; と配列の形で定義した場合のa1については、
a1[0]やa1[1]等を、通常のchar型の変数と全く同じように扱うことが
できます。しかし、a1自体は、例えば a1 = p1; のように値を代入する
ことができません。(逆の p1 = a1; は可能。)つまり...続きを読む

Q光 脱毛 目 まぶしい

光脱毛ですごくまぶしさを感じます。
そこでは、顔にタオルを掛けた上からサングラスをして施術をします。
私は、顔とサングラスの間のタオル部分から光が入り込んでくるんだと思っています。タオルなんて強い光を遮るほど遮光性があるとは思えません。
やるならむしろ顔にサングラスをかけ(目と顔の隙間をなくす)、その上からタオル(サングラスと顔のあいてる部分対策)をした方が、余計な光を遮ってくれると思うのです。
他のお店でも顔にタオルをかけサングラスをつけるのでしょうか?
あんな強い光を受けて、目が悪くならないか心配ですが、他の脱毛をしている皆さんはあまり気にしないのでしょうか?
お店で聞いたら、アイマスクを持ってくる人もいるということですが、対策はそれくらいなのでしょうか?

Aベストアンサー

こんにちは

以前から私も光を照射する脱毛を受けています

私が通う店舗ではタオルの上から遮光性のあるゴーグルをかけます
ゴーグルなので目の周辺に密着します
なので照射時には一切光を感じる事がありません
たしかにあれだけの光ですからサングラスでは隙間から光を感じてしまいますよね…

人それぞれに光の感じ方は異なります
質問者様がその光を不快に感じるようであるならアイマスクの持ち込みが最も簡単に出来る対応策かもしれませんね

回答というより意見になってしまいました
お互いスムーズに脱毛が進と良いですね~

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Q眼科で光がまぶしいという症状を訴えることについて。

恐らく精神的なことが原因で光がまぶしいと感じる目の症状を眼科で訴えることに意味はあるのでしょうか。
精神的なことが原因だと思うのは、生理期間中に普段、精神的不安定なのがさらに悪化する体質なのですが、そうなると必ず目がまぶしい症状も酷くなるからです。(そういうとき、スマートフォンの画面を一番暗い設定にしてもまぶしくて辛いです。サングラスをかけてやっているくらいです。)



最近、目が悪くなり、メガネを購入するために眼科に行こうと考えていて、ついでにこの症状も訴えようと思いますが、どうでしょうか。

現在、私は10代です。

Aベストアンサー

光視症、角膜炎など、眩しいと感じてしまう病気があります。
早めに眼科に行って検査してください。
お大事に。

↓はまぶしいと感じる症状の病気の一覧です。
http://www.kyoya-ganka.jp/disease/list_15.shtml

Qint i, int i[1];

C++で、
 int i;
と、
 int i[1];
は、どっちで宣言をしても、iは同じ振るまいですか?

Aベストアンサー

配列、ポインタなどよりももっと基礎的な概念である「右辺値」、「左辺値」を理解しましょう。

int i ;
この形で宣言されたiは代入式の右辺(代入する値)にも左辺(代入される領域)にも使うことが出来ます。
int a ;
a = i ;
i = 10 ;

C言語でも他のほとんどの言語でも「変数は右辺の時と左辺の時とでは解釈が違う」という原則があります。

代入式の右辺に配置出来るのは『値』です。
変数であっても良いし定数であっても、式であってもかまいません。
左辺がポインタ変数の場合は右辺はアドレス値(またはアドレス式)です。
代入式の右に配置可能な値を右辺値といいます。

代入式の左に配置出来るのは『領域』です。
変数であっても良いし、配列要素でもかまいません。
また、領域を示す式(int i[1]のときの*iなど)でもかまいません。
配列名(int i[1]のときのi)や定数は領域を持たないため、左辺に配置することが出来ません。
代入式の左に配置可能な領域を左辺値といいます。

int i[1] ;
この形で宣言されたiは右辺値に利用できます。
int *a ;
a = i ;
しかし、iだけでは領域を持たないため左辺値になりえません。
i = 1 ; //コンパイルエラーが出る。

コンパイル時に「有効な左辺値でない」と言う意味のエラーが出るのは「領域を示さない値を左辺値として使っている時」です。

どちらかと言うと「基礎理論」の部類なのでプログラム言語の本などには書いてないのですが、実は最も大切なのが「基礎理論」です。
頑張って勉強してください。

配列、ポインタなどよりももっと基礎的な概念である「右辺値」、「左辺値」を理解しましょう。

int i ;
この形で宣言されたiは代入式の右辺(代入する値)にも左辺(代入される領域)にも使うことが出来ます。
int a ;
a = i ;
i = 10 ;

C言語でも他のほとんどの言語でも「変数は右辺の時と左辺の時とでは解釈が違う」という原則があります。

代入式の右辺に配置出来るのは『値』です。
変数であっても良いし定数であっても、式であってもかまいません。
左辺がポインタ変数の場合は右辺はアドレス...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報