文字列形式で保存された番号とデジタル形式で保存された番号には違いがあります。
たとえば、文字列「2679」は数字ではありません。ASCIIコード2、6、7、および9の4文字のシーケンスです。文字列「2679」は数値ではないため、コンパイラは、加算、乗算、除算などの数学的な操作を実行することを許可しません。数値で表される文字列は、算術演算子で使用する前に、まず数値形式に変換する必要があります。
同様に、int、long、doubleなどのデジタル形式のプログラム値は、結果の文字列をファイルや他の入力および出力デバイス、またはメモリに保存されている文字にすぐに出力できるように、文字列形式に変換する必要がある場合があります後で使用するための文字列オブジェクト。
ユーザーがキーボードで数字を入力すると、ユーザーが入力した一連の文字(数字)と同じように、数字が文字列の形式で入力されます。 C ++ 、そのような数値は、通常>>ストリーム抽出オペレータによって読み取られます。数値変数に格納する前に、オペレーターは必要に応じて自動的に変換を実行します。出力中、数値から文字列への逆変換は、ストリーム出力演算子<<によって実行されます。
数値変換に文字列ストリームオブジェクトを使用する
C ++には、ostringstreamとistringstreamの2つのクラスがあり、メモリ内の値に対して文字列/数値の変換を実行するために使用できます。
ostringstreamクラスはostreamのサブクラスであり(coutもこのクラスに属します)、ストリーム挿入演算子<<を使用して数値を文字列に変換します。ostringstreamタイプのオブジェクトは、coutおよびfileオブジェクトと同じように機能しますが、画面またはファイルにデータを書き込む代わりに、含まれているstringオブジェクトに書き込みます。
ostringstreamオブジェクトで<<を使用するたびに、必要な数値から文字列への変換が実行され、その結果が文字列の最後に追加されます。ostreamクラスのすべてのメンバー関数と演算子をサポートすることに加えて、ostringstreamオブジェクトは表1に示すstrメンバー関数もサポートします。
istringstreamクラスはistreamから派生しています。内部に文字列オブジェクトが含まれており、関数はそれを「読み取る」ことができる入力ストリームとして使用します。
入力ストリームは、オブジェクトの作成時にisringstreamコンストラクターによって設定することも、オブジェクトの作成後にstr(string s)関数を呼び出すことによって設定することもできます。ストリーム抽出演算子>>は、閉じた文字列から読み取り、必要に応じて文字列を数値に変換します。表1に、isringstreamのメンバー関数を示しますsstream
。これらのクラスを使用するには、プログラムにヘッダーファイルを含める必要があります 。
メンバー機能 | 描 述 |
---|---|
istringstream(string s) | istringstreamのコンストラクター:オブジェクトの入力ストリームの初期値を設定します。例: istringstream istr( "50 64 28"); |
ostringstream(string s) | ostringstreamのコンストラクター:オブジェクトの出力ストリームの初期値を設定します。例: ostringstream ostr( "50 64 28"); |
文字列str() | ostringstreamまたはisringstreamオブジェクトに含まれる文字列を返します。例: string is = istr.str(); string os = ostr.str(); |
void str(string&s) | 入力ストリームまたは出力ストリームの文字列をオブジェクトとして設定します。例: ostr.str( "50 64 28"); istr.str( "50 64 28"); |
次のプログラムは、これらのクラスの使用法を示しています。
- //このプログラムはsstreamオブジェクトの使用法を示しています
- #include <sstream>
- #include <iostream>
- #include <string>
- u sing名前空間std;
- int main()
- {{
- string str = "John 20 50"; //読み取る文字列
- const char * cstr = "Amy 30 42"; //読み取るCstring
- istringstream istr1(str); // istr1はstrから読み取ります
- istringstream istr2; // istr2はcstrから読み取ります
- ostringstream ostr; //書き込むostringstreamオブジェクト
- 文字列名;
- int score1、score2、average_score;
- //名前とスコアを読み取り、平均を計算してから、ostrに書き込みます
- istr1 >>名前>>スコア1 >>スコア2;
- 平均スコア=(スコア1 +スコア2)/ 2;
- ostr << name << "は平均スコア" << average_score << "\ n";
- // C文字列から読み取るようにistr2を設定し、上記を繰り返します
- istr2.str(cstr);
- istr2 >>名前>>スコア1 >>スコア2;
- 平均スコア=(スコア1 +スコア2)/ 2;
- ostr << name << "は平均スコア" << average_score << "\ n";
- // ostrで16進出力に切り替えます
- ostr << hex;
- //エイミーのスコアを16進数で記述します
- ostr << name << "の16進数のスコアは次のとおりです:" << score1 << "および" << score2 << "\ n";
- // ostrから文字列を抽出し、画面に出力します
- cout << ostr.str();
- 0を返します。
- }
プログラム出力:
ジョンの平均スコア
35
エイミーの平均スコア36エイミーの16進数のスコアは1eと2aです。
これらのクラスには、8進数や16進数などの異なるベースを使用して数値を文字列に変換する機能など、ostreamおよびistreamオブジェクトのすべての機能があることに注意してください。もちろん、それらにも欠陥があり、挿入演算子と抽出演算子を使用して変換を実行できるように、プログラマーにsstreamオブジェクトの作成を強制します。
数値変換機能
C ++ 11には、T型の数値を文字列形式に変換するためのto_string(T value)関数がいくつか用意されています。以下は、いくつかのto_string()関数のリストです。
string to_string(int value)
string to_string(long value)
string to_string(double value)
次のコード例を見てください。
- int a = 5;
- 文字列str = to_string(a * a);
- cout << "5の平方根は" << str << endl;
上記の例は、この一連の関数の使用法を示しています。次の文字列が出力されます。
5の平方根は25です
to_string()関数は、非10進整数の変換を処理できません。この機能が必要な場合は、ostringsteamオブジェクトを使用して変換を完了する必要があります。
文字列から数値への変換は、stoX()シリーズの関数で実行できます。この一連の関数のメンバーは、文字列をint、long、float、およびdoubleタイプの数値に変換できます。具体的な構文は次のとおりです。
int
stoi(conststrings str、size_t * pos = 0、int base = 10)long stol(conststrings str、size_t * pos = 0、int base = 10)
float stof(conststrings str、size_t * pos = 0)
double stod(const string str、size_t * pos = 0)
最初の正式なパラメータstrは文字列(「-342」や「3.48」など)であり、適切なデジタル形式に変換されます。これらの関数は、strの可能な限り長いプレフィックスを数値に変換し、整数アドレスposを返すことができます。ここで、変換できない最初の文字のインデックスはposに格納されます。タイプsize_tは標準ライブラリで定義されており、配列、ベクトル、または文字列内の符号なし整数またはインデックスのサイズを表すためによく使用されます。
たとえば、文字列「-34iseven」を変換しようとすると、整数-34が正常に返され、変換できない最初の文字の位置posが3に設定されます。ベースパラメータは整数変換にのみ適用可能であり、変換に使用されるベースを示します。posパラメータとbaseパラメータはどちらもオプションであるため、無視してかまいません。posを省略すると、停止文字のインデックスは保存されません。baseを省略すると、デフォルトで10進数になります。文字列strに「is-34even?」などの無効な値が含まれている場合、変換は実行されず、関数はinvalid_argument例外をスローします。
次のプログラムは、文字列変換関数の使用法を示しています。
プレーンテキストコピー
- //このプログラムは、stoXXX()の使用法を示しています
- //数値変換関数。
- #include <string>
- #include <iostream>
- 名前空間stdを使用します。
- int main()
- {{
- 文字列str; //変換する文字列
- size_t pos; //停止文字の位置を保持します
- //文字列をdoubleに変換します
- str = "-342.57は数値です";
- cout << "文字列は" << str << endl;
- double d = stod(str、&pos);
- cout << "変換されたdoubleは" << d << endl;
- cout << "停止文字は" << str [pos] << "の位置" << pos << endl;
- //文字列をintに変換します(デフォルトは10進数)
- str = "-342.57は数値です";
- cout << "\ n文字列は" << str << endl;
- int i = stoi(str、&pos);
- cout << "変換された整数は" << i << endl;
- cout << "停止文字は" << str [pos] << "の位置" << pos << endl;
- //文字列をintに変換します(基数はバイナリです)
- str = "01110バイナリ番号";
- cout << "\ n文字列は" << str << endl;
- i = stoi(str、&pos、2);
- cout << "変換された2進整数は" << i << endl;
- cout << "停止文字は" << str [pos] << "の位置" << pos << endl;
- 0を返します。
- }
プログラム出力:
文字列は-342.57は数値です
。変換されたdoubleは-342.57です
。停止文字は位置7
のiです。文字列は-342.57は数値です
。変換された整数は-342
です。停止文字は。です。位置4で
文字列は01110
バイナリ数です変換されたバイナリ整数は14です
停止文字は位置5でbです