- ベストアンサー
ポインタを使用 [数字列を数値に変換]
カンマ(,)区切りの数字列を ポインタを使って 数値に変換したいのですが、わかりません。 教えてください。お願いします。 char data[]="5436,434";
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
No.3 です。 >atoi という文法を初めて知りました。 >とても便利ですね。 >まだ習っていない文法ですので、使ったらあかん言われました。 失礼しました、「桁の計算」等の思考を含む「ポインタ」の勉強だったですね。 つい便利なものだから・・。 >'-0' で数値化をしてそれを繰り返すのかと思っていますが、桁の計算をどうすればいいのかわかりせん。 ・-'0' ですね(★)。 ・「繰り返す」のは、while()文で。 ・「桁の計算」は、10倍して加えるだけ。 例)文字列 "321" の場合。 1)はじめに、'3' - '0' で 3 2)次に、3 * 10 = 30、'2' - '0' で 2、30 + 2 = 32 3)次に、32 * 10 = 320、'1' - '0' で 1、320 + 1 = 321 ここで重要なのは、次の文字が「数」と判った時点で10倍することです。 参考:http://e-words.jp/p/r-ascii.html 注 :使用文字は、数文字とカンマの11ケ限定。 #include <stdio.h> void main() { char data[ 32 ] = "54321,4321,321,21,1"; // 末尾に '\0' をコンパイラが追加 char *p = data; int iVal = 0; // 初期化 while( *p ){ iVal *= 10; // 桁上げ iVal += ( *p - '0' ); // 数字 → 数値★、加算 p++; // 次の文字へ if( '\0' == *p ){ // 終了 printf( "%d\n", iVal ); break; } if( ',' == *p ){ printf( "%d\n", iVal ); iVal = 0; // 初期化 p++; // 次の文字へ } } } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
その他の回答 (6)
- Wr5
- ベストアンサー率53% (2173/4061)
>atoi()という便利な文法初めて知りました! 文法ではなく、関数です。 >int型の数字 "5432,434"を導き出したいです。 「数字」と「数値」の違いは理解されていますか? >'-0' で数値化をしてそれを繰り返すのかと思っていますが、桁の計算をどうすればいいのかわかりせん。 1)数値を入れる変数を0で初期化しておきます。 2)1文字目の文字コードから'0'を引いて数値化して数値を入れる変数に足します。 3)次の文字も数字だったら数値を入れる変数の内容を10倍して再格納します。 4)3)で判定した文字から'0'を引いて数値化して数値を入れる変数に足します。 5)3)から4)を数字が続く限り続けます。 と、そんな感じで。
- asuncion
- ベストアンサー率33% (2127/6289)
>char data[]="5436,434"; >文字列の配列から、 >int型の数字 "5432,434"を導き出したいです。 答えになっていないです。 5436(ごせんよんひゃくさんじゅうろく) 434(よんひゃくさんじゅうよん) の、2個の数値を得たいのですか?
補足
はい。そうです!
- asuncion
- ベストアンサー率33% (2127/6289)
>char data[]="5436,434"; この例題からどういう数値を拾い出したいかを明記してください。 そうしないと、すべての回答は空論に過ぎなくなってしまいます。
補足
説明不足ですみません。 char data[]="5436,434"; 文字列の配列から、 int型の数字 "5432,434"を導き出したいです。
- yama5140
- ベストアンサー率54% (136/250)
>ポインタを使って 数値に変換したいのですが、わかりません。 課題ならば、int main() + return( 0 ); に変えてください。 #include <stdio.h> #include <stdlib.h> void main() { char data[ 32 ] = "54321,4321,321,21,1"; char *p = data; int iVal; while( *p ){ iVal = atoi( p ); // , の手前まで printf( "%d\n", iVal ); while( *p && ( ',' != *p ) ) p++; if( '\0' == *p ) break; // 終了 p++; // , の次(数字の先頭) } } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
お礼
ソースありがとうございました。 atoi という文法を初めて知りました。 とても便利ですね。 まだ習っていない文法ですので、使ったらあかん言われました。 '-0' で数値化をしてそれを繰り返すのかと思っていますが、桁の計算をどうすればいいのかわかりせん。
- titokani
- ベストアンサー率19% (341/1726)
カンマの数が決まっているなら、sscanfが一番便利です。 int a,b; sscanf("5436,434","%d ,%d",&a,&b); ポインタも一応使ってるし。それとも課題?
- Wr5
- ベストアンサー率53% (2173/4061)
お手軽なのは…strtok()で分解してatoi()で数値化する。 でしょうか。 カンマが続いていたり、数字以外で始まっていたりすると正しく数値化できませんが。 割とよくある事例と思いますので検索するとそれなりに情報が手には入るかと思います。
お礼
ご回答ありがとうございました。 atoi()という便利な文法初めて知りました! まだ習ってないので使えないですが、勉強になりました。
お礼
丁寧な解説ありがとうございました。 頭の中がごっちゃになっていたので、すごくすっきりしました。 理解できそうです。 これからソースを読んでいこうと思います。 ありがとうございました!!