C++ で std::stod 関数ファミリーを使用する

胡金庫 2023年10月12日
C++ で std::stod 関数ファミリーを使用する

この記事では、C++ で std::stod ファミリーの関数を使用する方法について説明し、説明します。

std::stod を使用して、文字列を C++ の浮動小数点値に変換する

std::stod 関数は std::stof および std::stold とともに STL によって提供され、文字列から浮動小数点への変換を実行します。変換と言いますが、これは文字列の内容を浮動小数点値として解釈するようなものであることに注意してください。つまり、これらの関数は、事前定義された解析ルールを使用して指定された文字列引数をスキャンし、有効な浮動小数点数を識別して、対応する型オブジェクトに格納します。

関数は、返されるタイプを示す接尾辞によって区別されます。std::stod オブジェクトは double 値を返し、std::stof は float を返し、std::stoldlong double を返します。これらの関数は C++ 11 以降 STL の一部であり、<string> ヘッダーファイルに含まれています。

以下のコードスニペットでは、さまざまな変換シナリオを調査し、これらの関数の解析ルールを掘り下げます。最初の例は、string オブジェクトに数字と小数点記号(.)のみが含まれている最も単純なケースです。std::stod 関数は、指定された文字シーケンスを有効な浮動小数点数として解釈し、それらを double タイプに格納します。小数点は数値の一部とは見なされないため、コンマ(.)文字にすることはできません。

#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

int main() {
  string str1 = "123.0";
  string str2 = "0.123";

  auto m1 = std::stod(str1);
  auto m2 = std::stod(str2);

  cout << "std::stod(\"" << str1 << "\") is " << m1 << endl;
  cout << "std::stod(\"" << str2 << "\") is " << m2 << endl;

  return EXIT_SUCCESS;
}

出力:

std::stod("123.0") is 123
std::stod("0.123") is 0.123

あるいは、数字が他の文字と混合されている文字列オブジェクトがある場合、2つの一般的なケースを選び出すことができます。最初のシナリオ:string オブジェクトは数字で始まり、その後に他の文字が続きます。std::stod 関数は、最初の非数字文字(小数点を除く)が検出される前に開始桁を抽出します。

2 番目のシナリオ:string 引数は数字以外の文字で始まります。この場合、関数は std::invalid_argument 例外をスローし、変換を実行できません。

#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

int main() {
  string str3 = "123.4 with chars";
  string str4 = "chars 1.2";

  auto m3 = std::stod(str3);
  //    auto m4 = std::stod(str4);

  cout << "std::stod(\"" << str3 << "\") is " << m3 << endl;

  return EXIT_SUCCESS;
}

出力:

std::stod("123.0") is 123
std::stod("0.123") is 0.123

通常、std::stod とその関数ファミリーは、開始空白文字を破棄します。したがって、次の例に示すように、複数の先頭の空白文字とそれに続く数字を含む文字列を渡すと、変換は正常に実行されます。

さらに、これらの関数は、タイプ size_t*のオプションの引数を取ることができます。これは、呼び出しが成功した場合に処理された文字数を格納します。文字列が有効な浮動小数点数に変換された場合、先頭の空白文字もカウントされることに注意してください。

#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

int main() {
  string str3 = "123.4 with chars";
  string str5 = "           123.4";

  size_t ptr1 = -1;
  size_t ptr2 = -1;

  auto m4 = std::stod(str3, &ptr1);
  auto m5 = std::stod(str5, &ptr2);

  cout << m4 << " - characters processed: " << ptr1 << endl;
  cout << "std::stod(\"" << str5 << "\") is " << m5 << " - " << ptr2
       << " characters processed" << endl;
  cout << "length: " << str5.size() << endl;

  return EXIT_SUCCESS;
}

出力:

123.4 - characters processed: 5
std::stod("           123.4") is 123.4 - 16 characters processed
length: 16
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Function