2012-01-20 17 views
0

を使用せずにintへのstd ::文字列、ダブルなどの変換++私は、これが文字の配列に文字列オブジェクトを変換することによって行わ見てきました。配列を含むチュートリアルは私が理解するのが少し難しいです。しかし、私は配列なしで変換をしたい。C++ Cでchar配列

私はそれを行うにはどのようなアイデアを持っています:文字列は「1234」です。その後、私はこの文章を次のように整数に変換します。

if (symol4 == "4") int_var += 4 * 1; 
if (symol3 == "3") int_var += 3 * 10; 
if (symol3 == "2") int_var += 2 * 100; 
if (symol3 == "1") int_var += 1 * 1000; //Don't worry, I'm familiar with cycles, this code is only for explaining my algorithm 

私はあなたがそのアイデアを理解できることを願っています。

しかし、これが最善の方法かどうかはわかりません。私はそれをすることを可能にする機能を持っているライブラリがあるかどうか分かりません(もしあれば私は驚かないでしょう)。

文字配列を使用しないのは良い考えです。しかし、それは私が後で尋ねる別の質問です。

文字の配列を使用せずになど、ダブル、文字列を整数に変換するための最良の方法は何でしょう。

+4

しかし、文字列**は定義上**の文字配列です。 – littleadv

+0

std :: stringを参照していますか?さもなければ文字列は確かに文字の配列です。 – Hari

+0

littleadv、私は知っています。しかし、私は別の文字の配列なしでそれをしたいです。 – AlexSavAlexandrov

答えて

8

boost::lexical_castint result = boost::lexical_cast<int>(input)

あなたはブーストに依存したくない場合は、あなたがにstringstreamを使用することができ、のようなもの:

それは芋ロータリーむしろ

ですそして、noはatoiを使用しないでください。その機能はC言語でさえも欠陥があり、時間とともに改善されていません。構文解析中にエラーが発生した場合は0を返します。エラーは文字列"0"の解析とどのように区別しているのか明らかに問題があります。

+0

私は "とatoiを使用しないでください!"が好きです! – Krizz

+0

私は「1234」を4つの整数、「4」、「30」、「200」、「1000」に分解したいと言っていると思います。 –

+0

boost :: lexical_castです。ありがとう! – AlexSavAlexandrov

-1

あなたはatoi機能で見たいと思うかもしれません。

+3

この質問にはC++タグがあります。 – Krizz

2

使用できる機能atoiがあります。これは文字配列に変換されますが、forループで配列をインデックスする数学を行う必要はありません。 ATOIのいやさセイヤーズの場合

#include <stdlib.h> 
... 
String number = "1234";  
int value = atoi(number.c_str()); 
std::cout << number; 
... 

、うまくいけば、彼は>このことを理解しましょう。>

#include <boost/lexical_cast.hpp> 

try { 
    int x = boost::lexical_cast<int>("123"); 
} catch(boost::bad_lexical_cast const&) { 
    std::cout << "Error: input string was not valid" << std::endl; 
} 

最善の方法は、最も効率的な方法ですが、私はあなたがより良い代替手段を見つけるとは思いませんこれに、または文字配列を使用します。救助へ

+2

'atoi'はC++にタグ付けされた質問にありますか?私は望んでいない。 THAT機能の設計上​​の問題は数多くあります。 – Voo

+0

C++タグのためのC-ish。 – Krizz

5

は、私は本当にあなたの貼り付けコードとは何か得るが、C++整数またはfloatに文字列を変換するための最良の方法でstringstreamを使用することであることはできません。

const char* str = "10 20.5"; 
std::stringstream ss(str); 
int x; 
float y; 

ss >> x >> y; 
1

標準stringクラスはすでにあなただけの整数を解析し、標準Cライブラリ関数の一つにこれを渡すことができますので、あなたのような、内部文字配列、c_str()にアクセスできますメンバ関数を持っていますstrtolは():あなたはすでに文字列が有効な整数である知っているとエラーチェックを気にしない場合

string s = "1234"; 
long n = strtol(s.c_str(), 0, 10); 

最も簡単なコードです。

char* end = 0; 
errno = 0; 
long n = strtol(s.c_str(), &end, 10); 
if (end == 0 || *end == 0) 
    throw invalid_argument("Not a number"); 
else if (errno == ERANGE) 
    throw overflow_error("Number is out of range"); 
else if (errno != 0) 
    throw invalid_argument("Not a number"); 

また、あなたがC++を使用して、完全にCスタイルの文字配列を避けたい場合は(というか、完全にクラス内でそれらを隠す)ストリームを使用できます:

あなたは完全なエラーチェックをしたい場合は、このような何かをするだろう
istringstream in(s); 
int n; 
in >> n; 

boost :: lexical_castを使うこともできますが、これは基本的に同じことです。

1
  • は私が

  • Boost.Lexical_Cast

    を推奨したり、今後のBoost.Conversionを参照してください

  • もBoost.Spiritを使用して達成したが、多少複雑であることができます

Herb Sutterの "Manor Farmの文字列フォーマッタ" articleを参照してください。