• 締切済み

文字配列から数値への変換

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; }

みんなの回答

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.5

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)
回答No.4

間違いではありませんが、 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 );  } } 注:インデントに全角空白を用いています。

参考URL:
http://www.bohyoh.com/CandCPP/C/Library/index.html
全文を見る
すると、全ての回答が全文表示されます。
  • ko_kinta
  • ベストアンサー率39% (43/109)
回答No.3

どうしてもこの形式でやりたいのであれば、各文字列の4文字目以降を取り出せばいいのでは? str[argc]は各文字列の先頭アドレスを指しています。 str[argc]+1は各文字列の2文字目のアドレスを指します。 というヒントでやってみてください。 でも引数argcを参照以外に使うのは、う~ん。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

ソースコードを見て思ったのですが、 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)
回答No.1

atof() の仕様は 最初から数字にできるところまでを 数字にする、です。間に空白文字が入ったところ以降は 数字には変換されていません。しろ、といってもatof() が困ってしまうでしょう。 6個の配列要素に分解すればいいだけなわけですが、 もしもそれが目的に合わないということであれば、 各文字列の2つずつの要素を2つの文字列にわけるように するとよいでしょう。 なお、ループの制御変数にargcを用いるのはちょっといただけません。 int i とかで回しましょう。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語のprintfで桁数をそろえる

    次ので桁数をそろえると書いてあったけどやってみたらできなかった。 コンパイラはMS visual c++バージョンはおそらく7.1.3019 #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int a; scanf("%d",&a); printf("a=%3d\n",a); return 0; }

  • _TCHAR*での引数の読み込み

    VC++2010での、通常の #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { return 0; } のウィザードを使って、arvg[1]やargv[2]に引数を与えて、本体内で通常のCで使う printf("%s\n", argv[1]); や fopen(argv[1], "r"); を使いたいのですが、引数の型が_TCHAR*になっているため文字がそのまま使えません。 int main(int argc, char *argv[]) で使えば問題なく使えるのですが、デフォルトのウィザードを使った時の使い方を知っておきたいのです。 御経験のある方、御教示お願い致します。

  • c++ TCHARで文字化け

    TCHARはUNICODEが扱えるときいたので早速つかってみた。以下は引数を表示するプログラムである。 Visual C++ Express Editionを使った。 #include <stdio.h> #include <tchar.h> int _tmain(int argc, _TCHAR* argv[]) { int i=0; while(i<argc){ _tprintf(_T("%s\r\n"),argv[i++]); } return 0; } しかし上記プログラムに日本語の引数をわたすと文字化けするではないか。なでしょうか?

  • 関数に配列を渡した場合にサイズが

    C言語初心者です。 以下のように関数に配列を渡した場合、サイズが変わってしまうのは何故でしょうか。 #include "stdafx.h" void fanc(char [3]); int _tmain(int argc, _TCHAR* argv[]) { char a[] = {'a','b','c'}; printf("%d\n",sizeof(a)); // aのサイズ 3 fanc(a); return 0; } void fanc(char b[]){ printf("%d\n",sizeof(b)); // bのサイズ 4 }

  • VC++2010 EE で #ifdef _MSC_VER #endi

    VC++2010 EE で #ifdef _MSC_VER #endif でエラー ソース始まり // _msc_ver.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #ifdef _MSC_VER #include "stdafx.h" #endif int _tmain(int argc, _TCHAR* argv[]) { return 0; } ソース終わり > fatal error C1020: 予期しない #endif です。 と出ます。なぜでしょうか?

  • C++でismbblead()が使えない。

    http://www.orchid.co.jp/computer/cschool/kanji1.html 上記のサイトを参考にVS2013で以下のようなソースを書きました。 #include "stdafx.h" #include "stdio.h" int _tmain(int argc, _TCHAR* argv[]) { char *str = "123498765abcd漢字0000"; int i1; for (i1 = 0;;){ if (str[i1] == '\0')break; if (_ismbblead(str[i1])){ if (str[i1 + 1] == '\0'){ break; } putchar('['); putchar(str[i1++]); putchar(str[i1++]); putchar(']'); continue; } putchar(str[i1++]); } return 0; } 残念なことにコンパイルはとうらず、ismbbleadの部分が引っ掛かっているようでした。 C++だと使えないCのメソッドもあるのでしょうか? そういうわけでないのであればなぜ、コンパイルは通らないのでしょうか?C言語のコンパイラでは問題なく参考サイトのソースはコンパイルできました。 出ているエラーは IntelliSense: 識別子 "_ismbblead" が定義されていません error C3861: '_ismbblead': 識別子が見つかりませんでした というものでした。よろしくお願いします。

  • argv内容の表示動作

    プログラミング初心者です。 コンソールアプリケーションのプログラミングの練習として、コマンドライン引数を表示することを考えています。書籍等を参考に手元で入力したソースでは、先頭の一文字しか表示されません。例えば、コマンドラインから > test.exe abc def ghi と入力すると、 > argv[0] = t > argv[1] = a > argv[2] = d > argv[3] = g と表示されます。 環境はWindowsXP + VisualStudio2008で、ソースは下のような具合です。 #include "stdafx.h" int _tmain(int argc, _TCHAR *argv[]){ int i; for ( i = 0; i < argc; i++){ printf("argv[%d] = %s\n", i, argv[i]); } return 0; } どの箇所が原因でこのようになってしまうのでしょうか?

  • 【C++】関数ポインタの使い方

    関数ポインタの使い方で悩んでいます。 下記の (1)のようにグローバルメソッドとして定義したメソッドを関数ポインタに代入することは出来るのですが、 (2)のようにクラスのメンバメソッドとして定義したメソッドは関数ポインタに代入することは出来ませんでした。 Error:バインドされた関数へのポインターは関数の呼び出しにのみ使用できます。 というエラーが発生します。 関数ポインタに外部参照でメソッドを代入することは出来ないのでしょうか? -----(1)------------------------------------------------------------------ #include "stdafx.h" #include <iostream> using namespace std; int f(int a, int b){ return a * b; } int _tmain(int argc, _TCHAR* argv[]) { typedef int (* FUNC_POINTER)(int, int); FUNC_POINTER fp; fp = f; cout << fp(1,2) <<endl; getchar(); return 0; } ------------------------------------------------------------------------- -----(2)------------------------------------------------------------------ #include "stdafx.h" #include <iostream> using namespace std; class MPointerList{ public: int f(int a, int b){ return a * b; } }; int _tmain(int argc, _TCHAR* argv[]) { typedef int (* FUNC_POINTER)(int, int); FUNC_POINTER fp; //fp = f; MPointerList mP; fp = mP.f; cout << fp(1,2) <<endl; getchar(); return 0; } -------------------------------------------------------------------------

  • C言語のフローチャート

    昨日に引き続き失礼します。下記のプログラムを作成したのですがフローチャートは、どのように書けばいいのでしょうか? #include "stdafx.h" #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) { char ss[10] = "abcdefg"; char *ssp; ssp =ss; while (1){ if (*ssp ==0) break; printf("文字 *ssp=%c\n",*ssp); ++ssp;} int ary[10] = {1,2,3,4,5,6,7,8,9,10}; int *pt; pt = ary; while (1) { if (*pt == 10) break; printf("値 *pt=%d\n",*pt); ++pt;} return 0; }

  • C++でEXEを作成してCGI-BINで動作させてますが、ブラウザからの入力を受ける方法がわからん

    自前のEXEでTESTとブラウザに表示させることに成功しました =========-- #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { cout << "Content-type: text/plain" << endl; cout << endl; cout << "test" << endl; return 0; } ==============--- さて、POSTメソッドで受けた内容や、ウラウザの種類やREFERなどはどうやってEXEで取得するのかがわかりません。教えてください。

    • ベストアンサー
    • CGI