編集:c ++ 17以降がfrom_chars
推奨されます。詳細については、こちらを参照してください: https://topanswers.xyz/cplusplus?q=724#a839
これを達成するstring str
方法はいくつかあり、それぞれに長所と短所があります。https://ideone.com/LO2Qnqに実際の例を書き、以下でそれぞれについて説明します。
示唆されているように、 here strtol
の out-parameter を使用して、読み取った文字数を取得できます。strtol
実際にはlong
an ではなくa を返すint
ため、戻り時にキャストが行われます。
char* size;
const int num = strtol(str.c_str(), &size, 10);
if(distance(str.c_str(), const_cast<const char*>(size)) == str.size()) {
cout << "strtol: " << num << endl;
} else {
cout << "strtol: error\n";
}
str.c_str()
これは同じ文字列を参照するために使用されることに注意してください。c_str
C++11 を使用している場合、一時的ではなく、文字ストレージとして機能する基になる配列へのポインターを返します。
c_str()
data()
同じ機能を実行します
また、次の場合を除き、 によって返されるポインターはとの呼び出しc_str
の間で有効であることに注意してください。strtol
distance
- への非
const
参照をstring
標準ライブラリ関数に渡す
- 、、、、、、、および
const
_ string
_ operator[]
_ at()
_ front()
_ back()
_ begin()
_ rbegin()
_end()
rend()
これらのケースのいずれかに違反した場合は、i
の基礎const char*
となる の一時的なコピーを作成し、その上でテストを実行する必要があります。
sscanf
を使用%zn
して、読み取った文字数を返すことができます。これは、ポインター比較を行うよりも直感的です。ベースが重要な場合はsscanf
、適切な選択ではない可能性があります。基数 2 ~ 36 をサポートするstrtol
およびとは異なり、8 進数 ( )、10 進数 ( )、および 16 進数( )のみの指定子を提供します。stoi
sscanf
%o
%d
%x
size_t size;
int num;
if(sscanf(str.c_str(), "%d%zn", &num, &size) == 1 && size == str.size()) {
cout << "sscanf: " << num << endl;
} else {
cout << "sscanf: error\n";
}
示唆されているように、 here のstoi
出力パラメータは、 が読み取った文字数を返すように機能します。C++ に合わせて、これは を取り、上記の C 実装とは異なり、空白以外の最初の文字が現在のベースの数字と見なされない場合にスローします。とブロック。sscanf
%n
string
stoi
invalid_argument
try
catch
try {
size_t size;
const auto num = stoi(str, &size);
if(size == str.size()) {
cout << "stoi: " << num << endl;
} else {
throw invalid_argument("invalid stoi argument");
}
} catch(const invalid_argument& /*e*/) {
cout << "stoi: error\n";
}