- ベストアンサー
C言語でchar型からint型への変換方法は?
- C言語でchar型からint型への変換方法を教えてください。
- プログラム内の数字を正確に抽出してint型に変換する方法を教えてください。
- C言語でchar型の数字をint型に変換する方法について教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>char a[6]=3+2-5; ここが char a[6]="3+2-5"; が正しいとして、 >下のe[]の出力ではめちゃくちゃな数字が出力されてしまいます。 '3'と'2'と'5'の文字コード番号を、空白を入れずに出力しています。 めちゃくちゃな値ではありません。 >きちんと数字だけを抽出しint型に変換するにはどうしたらいいでしょうか? e[i]=((int)c[i]-'0'); では不満ですか?
その他の回答 (3)
- tsuduki123
- ベストアンサー率32% (21/65)
個人的なおすすめは strtol(3)の利用ですね。 べんりですよ~
- asuncion
- ベストアンサー率33% (2127/6289)
>'3'と'2'と'5'の文字コード番号を、空白を入れずに出力しています。 おっと失礼。 '3'と'+'と'2'と'-'と'5'の文字コード番号を、空白を入れずに出力しています。 が正しいです。
- kmee
- ベストアンサー率55% (1857/3366)
??? > 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 */