#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と関連する良く見られている質問

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Q「memcpy」と「strcpy」について

C言語の初心者です。
先日、課題として以下のようなことを言われました。

「memcpyとstrcpyについて、メモリ破壊が起こるとしたら
どんな場合が考えられるか、簡単にまとめて報告してみて下さい。」
と言われました。

私にはメモリ破壊というニュアンスが分からないのですが、
どちらの関数も必要以上にコピーを行ったときに
起こるメモリ破壊ということなのでしょうか?
それとも、何か特別な意味があるのでしょうか?

C言語に詳しい方がいましたら、是非、教えて下さい。
宜しくお願いします。

Aベストアンサー

 メモリ破壊とは、「当然そこに入っているべき値」を、不用意に上書きしてしまうことです。

 たとえば、char a[100]; という宣言をしたとします。

 memcpy( a, 0, 200 );

 すると、このような実行を行った場合、変数 a の後ろにどんなメモリが存在しているのかプログラマは知ることができないのに、変数 a の後ろの未定メモリ100バイトを上書きしてしまいます。

 この未定メモリには、もしかしたら別の変数があるかもしれませんし、プログラムの一部があるかもしれません。あるいはOSのシステム領域かもしれません。
 どのみちプログラムは正常に動かなくなります。
 通常はメモリエラーが出て停止しますが、最悪の場合、メモリ上のOSを破壊してリセットするしかなくなったりもします。

 これがメモリ破壊です。

Qchar型にint型の数値を代入する。

たとえば、
int num;
char box; 

numに何らかの整数値が入っているときに、そのnumの中に入っている値をchar型に文字列として代入したいときはどのようにすればいいのでしょうか?

Aベストアンサー

sprintf()っていう関数がありますよ。書式は

sprintf(char型の配列の先頭ポインタ,フォーマット,変数...)

二番目の引数以降はprintf()の引数と同じです。たとえば

int num;
char box[256];
num=100;
sprintf(box,"%d",num);
printf("%s",box);

→100と出力される

Q構造体の代入と比較

構造体のコピーは以下のようで正しいと思いますが、

struct A {
int a;
};

struct x, y;

x.a=1;
y = x;

構造体の比較は
if (x != y)ではいけないのでしょうか?

構造体に限らずクラスも同じ考えでしょうか?

Aベストアンサー

★軽くアドバイス
・回答者No.3さんの
>if (memcmp(&x, &y, sizeof(struct A)) != 0)
 この方法はちょっと注意が必要です。
 アライメントに気をつけましょう。
・代入の方は古いCコンパイラでは無理なことがあります。
 最近のコンパイラなら問題はありません。

Qfatal error LNK1120: 外部参照 1 が未解決です

またわからないことが・・・
教えて下さい。
以下をVC++2005でコンパイルすると、

MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と警告がでて通りません。
何のことでしょうか。

#include<stdio.h>
#include<process.h>

struct meibo{
  char name[20];
  char tel[20];
  char address[20];
};

void message( void );
void input( FILE *fp, int cnt , struct meibo *a, int *end );

void main( void )
{
  struct meibo a[20];
  FILE *fp;
  int cnt, end;

  if( (fp=fopen( "meibo.dat", "w" ) ) == NULL ){
    printf( "Can not open the meibo.dat.\n" );
    exit( 1 );
  }

  message();

  fprintf( fp, "番号, 名前, TEL, 住所\n" );
  fflush( fp );

  cnt = 0;
  end = 0;
  while( end == 0 ){
    input( fp, cnt, &a[cnt], &end );
    cnt++;
    fflush( fp );
    if( cnt == 20 ){
      printf( "人数が一杯です.終了します.\n" );
      end = 1;
    }
  }
  fclose( fp );
}

void message( void )
{
  printf( "名前, TEL, 住所, endを入力してください.\n" );
  printf( "継続の時はend=0," );
  printf( "中止の時は,end=1と入力してください.\n" );
}

void input( FILE *fp, int cnt, struct meibo *a, int *end )
{
  printf( "名前-->" );
  scanf( "%s", a->name );
  printf( "TEL -->" );
  scanf( "%s", a->tel );
  printf( "住所-->" );
  scanf( "%s", a->address );
  printf( "Exit? Continue:0 Exit:1 -->" );
  scanf( "%d", end );
  printf( "\n" );
  fprintf( fp, "%2d, %s, %s, %s\n",
    cnt+1, a->name, a->tel, a->address );
}

またわからないことが・・・
教えて下さい。
以下をVC++2005でコンパイルすると、

MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と警告がでて通りません。
何のことでしょうか。

#include<stdio.h>
#include<process.h>

struct meibo{
  char name[20];
...続きを読む

Aベストアンサー

http://www.a.math.ryukoku.ac.jp/~hig/course/compsci2_2005/man/faq.html
にある現象と同じではないでしょうか、一度お試しください。

QC言語でシステム日付との差を求める

いつもお世話になっております。
C言語で以下のような処理を実現したいと思っているのですが
可能でしょうか。

「20091020」のような8桁の日付が文字列として格納されている
変数に対して、システム日付からどれくらい差があるか。

【例】
(1)システム日付が2009/10/19
(2)チェックしたい8桁の文字列="20091025"
(3)上記(1)、(2)を利用して、差が10~20の間の場合はNG!

といったことを実現したいです。

Aベストアンサー

お疲れ様です。
C言語で標準で規定されている関数のみで作成すると以下の通りになると思います。
(2038年問題等がありますが。。。)

#include<stdio.h>
#include<time.h>

int main()
{
time_t now,dat;
char *timedat = "20091030";
struct tm ts = {0};
double diff,nissuu;

/* 現在時刻の取得 */
now = time(NULL);

/* 日付をtime_tに変換 */
sscanf(timedat ,"%4d%2d%2d",&(ts.tm_year),&(ts.tm_mon),&(ts.tm_mday));
ts.tm_year -= 1900;
ts.tm_mon -= 1;
dat = mktime(&ts);

/* 差分算出 */
diff = difftime(dat, now);
nissuu = diff / (60*60*24);

}

お疲れ様です。
C言語で標準で規定されている関数のみで作成すると以下の通りになると思います。
(2038年問題等がありますが。。。)

#include<stdio.h>
#include<time.h>

int main()
{
time_t now,dat;
char *timedat = "20091030";
struct tm ts = {0};
double diff,nissuu;

/* 現在時刻の取得 */
now = time(NULL);

/* 日付をtime_tに変換 */
sscanf(timedat ,"%4d%2d%2d",&(ts.tm_year),&(ts.tm_mon),&(ts.tm_mday));
ts.tm_year -= 19...続きを読む

Q#defineの定数を文字列として読み込む

#define A "xxx"
#define B "yyy"
と定義しておいて

scanf("%s", str)
で読み込んだ文字列strが
"xxx"だった場合、"yyy"だった場合のように分岐したいのですが
このとき

if(str == "xxx")
のように中身を指定するのではなく

if(str == AA)
のように定数で分岐させることってできますか?

上記のままではできませんが、何か特別な関数とかでできるのでしょうか?

Aベストアンサー

こんにちは。

やりたいことの解釈ですが、(※勘違いの場合はすみません。)

1)マクロの名前(定義名)が文字列として格納された文字列 str があるとする。
 例)
   #define A "xxx"  //マクロ名=A
   char str[] = "A";   //"A"はマクロ名

2)上記の文字列 str を関数 func に渡す際に、マクロ名ではなくそのマクロで
  定義された文字列を渡したい。
 例)
   func( str );    //←この場合
    ↓
   func( "xxx" );  //←として展開される

ということで宜しいでしょうか?

だとした場合、少し回りくどいやり方かもしれませんが、以下のような文字列
変換用のマクロを定義してみては如何でしょうか?
※基本的には、他の回答者の方と同じように strcmp関数 を使用します。

■マクロ例
==============================
//文字列を定義したマクロ …※1
#define A "xxx"
#define B "yyy"

//引数を文字列として取得するマクロ
#define GETSTR(x) #x

//引数をマクロ名としてそのマクロで定義された文字列を取得するマクロ …※2
//注)<string.h>がインクルードされていることを前提とする
#define STR2MAC(str) \
!strcmp(str,GETSTR(A))? A : \
!strcmp(str,GETSTR(B))? B : str
==============================

上記マクロを使用して、関数 func にマクロ名が格納された文字列 str を
渡す場合は、
   func( STR2MAC( str ) );
のような記述になります。

前提として、※2のマクロ内でstrcmp関数を用いて文字列の照合を行って
いますので、<string.h>のインクルードが必要になります。

また、※1の文字列を定義するマクロの種類(パターン)を増やす場合、
※2のマクロの判定文もそれに合わせて増やす必要があります。

上記のマクロを使用したサンプルソースを下記に掲載致します。
注)エラー処理は行っていません。

■サンプルソース
==============================
#include <stdio.h>
#include <string.h>

//文字列を定義したマクロ
#define A "xxx"
#define B "yyy"

//引数を文字列として取得するマクロ
#define GETSTR(x) #x

//引数をマクロ名としてそのマクロで定義された文字列を取得するマクロ
//注)<string.h>がインクルードされていることを前提とする
#define STR2MAC(str) \
!strcmp(str,GETSTR(A))? A : \
!strcmp(str,GETSTR(B))? B : str

//プロトタイプ
void funcHoge( const char *str );

int main(void)
{
char sArg[128];

printf( "A or B ?>" );
scanf( "%s", sArg );

printf( "string1: %s\n", sArg );
funcHoge( STR2MAC(sArg) );

return 0;
}

void funcHoge( const char *str )
{
printf( "string2: %s\n", str );
}
==============================

■上記サンプルの実行結果
≫実行その1≪
A or B ?>A
string1: A
string2: xxx

≫実行その2≪
A or B ?>B
string1: B
string2: yyy

≫実行その3≪
A or B ?>hoge
string1: hoge
string2: hoge

以上です。

こんにちは。

やりたいことの解釈ですが、(※勘違いの場合はすみません。)

1)マクロの名前(定義名)が文字列として格納された文字列 str があるとする。
 例)
   #define A "xxx"  //マクロ名=A
   char str[] = "A";   //"A"はマクロ名

2)上記の文字列 str を関数 func に渡す際に、マクロ名ではなくそのマクロで
  定義された文字列を渡したい。
 例)
   func( str );    //←この場合
    ↓
   func( "xxx" );  //←として展開される

ということで宜しいでしょう...続きを読む


人気Q&Aランキング