- 締切済み
文字配列から数値への変換
MicrosoftのVisual-Studio 2005を使っています。 C/C++については、ほぼ素人で、困っています。 下記のような簡単なソースで、 456 012 678 を表示するようにしたいのですが、できなくて困っています。 最初の 123 789 345 は下記のソースで表記できたのですが、どうすればよいの でしょう? 数値をわざと文字列で読み込んで、これを 数値に変換しているのでややこしいのかもしれませんが、 できればこれでやりたいので、申し訳ありませんが、教えていただ けないのでしょうか。よろしくお願いします。 #include "stdafx.h" #include "stdlib.h" char str[3][200] = { "123 456", "789 012", "345 678" }; int _tmain(int argc, _TCHAR* argv[]) { int a[10]; for (argc = 0; argc < 3; argc++){ a[argc] = atof(str[argc]); printf("%d\n", a[argc]); }; return 0; }
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- titokani
- ベストアンサー率19% (341/1726)
atofの変わりに、strtodを使うといいと思います。 for (int i=0 ; i < 3; i++){ char *p; double a=strtod(str[i],&p); printf("%f\n", a); double b=strtod(p,NULL); printf("%f\n", b); }; こんな感じです。 intでいいなら、strtol,strtoulを使うといいでしょう。
- yama5140
- ベストアンサー率54% (136/250)
間違いではありませんが、 char str[3][200] = { "123 456", "789 012", "345 678" }; [3] が文字列の個数、 [200] が【各】文字列用の領域です。 この例ですと、3 X 200 バイト確保されます。 str[3][8] (◆)が最適かな。 ★次に本題、 文字列 "789 012" を数値で 789 と 012 と表示したい、とのこと。 ☆文字列を数値に変換 atof() でなく atoi() を使います(参考URL参照)。 "789 012" の後半部分の数値化は、 iVal = atoi( &str[1][4] ); となります。 str[1] は "789 012" で、str[1][4] は "0" です。 &str[1][4]は、"0" の場所を示します。 atoi は、与えられた場所から、数字でない文字の手前までの数字列を 数値化します(今回は str[1][7] が NULL )。 ☆3桁に満たない数値を、0埋めで表示する。 printf( "%03d\n", iVal ); とします。 http://www.k-cube.co.jp/wakaba/server/format.html ★まとめ void ValOut( int iCnt, char cStr[][8] ) // (◆) { int iVal, i; for( i = 0; i < iCnt; i++ ){ iVal = atoi( cStr[i] ); // 各文字列の前半 atoi( &cStr[i][0] );でも printf( "%03d,", iVal ); iVal = atoi( &cStr[i][4] ); // 各文字列の後半 printf( "%03d\n", iVal ); } } 注:インデントに全角空白を用いています。
- ko_kinta
- ベストアンサー率39% (43/109)
どうしてもこの形式でやりたいのであれば、各文字列の4文字目以降を取り出せばいいのでは? str[argc]は各文字列の先頭アドレスを指しています。 str[argc]+1は各文字列の2文字目のアドレスを指します。 というヒントでやってみてください。 でも引数argcを参照以外に使うのは、う~ん。
- sonata1229
- ベストアンサー率36% (76/206)
ソースコードを見て思ったのですが、 1.argcやargvについては理解した上で、for文で使用していますか? 2.char型、int型の変換以前に、配列について理解していますか? 3.str配列をint型で宣言していたと仮定して、望み通りの出力はできますか? 回答は述べませんが、ヒントまで。(argcはiにしてます) for ( i = 0; i < 3; i++ ) { a[ i ] = atof( str[ i ] ); printf("%d\n", a[ i ]); }; これは配列0番目から2番目までを出力していますよね。 つまり、1, 2, 3, 4, 5, 6 の6要素ある中の0番目から2番目までってこと。 んじゃ、456と出力したい場合は、何番目から何番目までをforで繰り返せばいいのかな~。 ということだけです。
- hsyL
- ベストアンサー率100% (3/3)
atof() の仕様は 最初から数字にできるところまでを 数字にする、です。間に空白文字が入ったところ以降は 数字には変換されていません。しろ、といってもatof() が困ってしまうでしょう。 6個の配列要素に分解すればいいだけなわけですが、 もしもそれが目的に合わないということであれば、 各文字列の2つずつの要素を2つの文字列にわけるように するとよいでしょう。 なお、ループの制御変数にargcを用いるのはちょっといただけません。 int i とかで回しましょう。