こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

char型からint型への変換

char型からint型への変換
char a[6]=3+2-5;
int e[6]; (全て0で初期化済)
for(i=0;i<6;i++){
if(c[i]=='0'||c[i]=='1'||c[i]=='2'||c[i]=='3'||c[i]=='4'||c[i]=='5'){
e[i]=((int)c[i]-'0');
printf("%d",e[i]);
}}
for(i=0;i<NUM_DATA;i++){
printf("%d",e[i]);
}

このプログラムでは上のe[]の出力では「325」と出力されますが、
下のe[]の出力ではめちゃくちゃな数字が出力されてしまいます。
きちんと数字だけを抽出しint型に変換するにはどうしたらいいでしょうか?
C言語で行っています。よろしくお願いします。

投稿日時 - 2010-06-15 20:16:11

QNo.5971014

すぐに回答ほしいです

質問者が選んだベストアンサー

>char a[6]=3+2-5;

ここが
char a[6]="3+2-5";
が正しいとして、

>下のe[]の出力ではめちゃくちゃな数字が出力されてしまいます。

'3'と'2'と'5'の文字コード番号を、空白を入れずに出力しています。
めちゃくちゃな値ではありません。

>きちんと数字だけを抽出しint型に変換するにはどうしたらいいでしょうか?

e[i]=((int)c[i]-'0');

では不満ですか?

投稿日時 - 2010-06-15 21:37:48

このQ&Aは役に立ちましたか?

9人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

個人的なおすすめは strtol(3)の利用ですね。
べんりですよ~

投稿日時 - 2010-06-15 22:12:51

ANo.3

>'3'と'2'と'5'の文字コード番号を、空白を入れずに出力しています。

おっと失礼。
'3'と'+'と'2'と'-'と'5'の文字コード番号を、空白を入れずに出力しています。
が正しいです。

投稿日時 - 2010-06-15 22:10:29

ANo.2

???
> char a[6]=3+2-5;
これは
char c[6]="3+2-5"
のつもりでしょうか?

e[6]が全部0で初期化されているとして、
上のループは
i=0: c[0]='3' → e[0]=3 を表示
i=1: c[1]='+' → 現状維持(e[1]=0のままで表示無し)
i=2: c[2]='2' → e[2]=2 を表示
i=3: c[3]='-' → 現状維持(e[3]=0のままで表示無し)
i=4: c[4]='5' → e[4]=5 を表示
i=5: c[5]='\0' → 現状維持(e[5]=0のままで表示無し)
となり、表示されるのは「325」です。
ここで、表示されているのはe[]の一部だということです。

対し、
> for(i=0;i<NUM_DATA;i++){
> printf("%d",e[i]);
>}
では(NUM_DATAについて説明がないので、仮に6だとして)、上では表示されなかったe[1],e[3],[e[5]が表示されるので
302050
になります。
もし、「0に初期化」がされてなかったり、途中で別な値が入っていたら、それがそのまま0のところに表示されます。
また、NUM_DATAが違えば、もっと短い桁で表示されたり、eの範囲外を参照してもっと変な値が表示されたりエラーになったりします。

数字でない場合はe[]に代入しない、num_dataには実際の数字の個数を入れる、ということなら
/* 大文字だけのものは、定数に使うのことが多いので小文字のものにした */
/* 個数と同時に、次に数値を入れる添字でもある */
int num_data=0;
for(i=0;i<6;i++){
if(c[i]=='0'||c[i]=='1'||c[i]=='2'||c[i]=='3'||c[i]=='4'||c[i]=='5'){
e[num_data]=((int)c[i]-'0');
++ num_data ;
}
}
for(i=0;i<num_data;i++){
printf("%d",e[i]);
}



また、「数字だけを抽出しint型に変換」というのも曖昧です。

'0'~'9'の数字を表わす文字を、整数型にするのは
> e[i]=((int)c[i]-'0');
この計算であっています。

全体で一つの値、(今回の例で「三百二十五」という数値)にしたいのなら、違うやり方が必要です。
例えばこんなの

int ans = 0 ; /* 計算結果用 */
for(i=0;i<6;i++){
if(c[i]=='0'||c[i]=='1'||c[i]=='2'||c[i]=='3'||c[i]=='4'||c[i]=='5'){
ans *= 10 ; /* 一桁左に */
ans += ((int)c[i]-'0'); /* あいた桁に足す */
}
}

printf("%d\n",ans); /* → 325 */

投稿日時 - 2010-06-15 21:54:47

あなたにオススメの質問