このフレーズstd::string::npos
は、次のコードスニペットで何を意味しますか?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
回答:
見つからないという意味です。
通常は次のように定義されます。
static const size_t npos = -1;
コードが読みやすいため、-1ではなくnposと比較することをお勧めします。
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
とget pos:4294967295 npos: 4294967295
私はWindowsのではなく、Macの私が手でそれを実行したときpos:4294967295 npos: 18446744073709551615
。それは正しくないようです... -1
代わりに比較することをお勧めしますstd::string::npos
string::npos
-1
非位置を表す定数(おそらく)です。find
パターンが見つからなかった場合は、メソッドによって返されます。
のドキュメントはstring::npos
言う:
nposは、type_t型の要素の最大値を持つ静的メンバー定数値です。
戻り値として、通常は失敗を示すために使用されます。
この定数は実際には-1の値(任意の特性)で定義されています。これは、size_tが符号なし整数型であるため、この型の表現可能な最大値になります。
size_t
は符号なし変数なので、 'unsigned value =-1'は自動的に最大可能値になりますsize_t
:18446744073709551615
string::size_type
find関数の戻り値の型に使用する必要があります。そうしないと、との比較が機能しstring::npos
ない可能性があります。
size_type
文字列のアロケータによって定義されるは、unsigned
整数型でなければなりません。デフォルトのアロケータアロケータはtype size_t
asを使用しsize_type
ます。-1
は符号なし整数型に変換されるため、nposはその型の符号なし最大値です。ただし、正確な値はtypeの正確な定義によって異なりsize_type
ます。残念ながら、これらの最大値は異なります。実際には、(unsigned long)-1
異なって(unsigned short)-
1かの種類が異なるのサイズ。したがって、比較
idx == std::string::npos
idxに値-1
とidxがあり、string::npos
タイプが異なる場合は、falseになる可能性があります。
std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}
このエラーを回避する1つの方法は、検索が直接失敗するかどうかを確認することです。
if (s.find("hi") == std::string::npos) {
...
}
ただし、多くの場合、一致する文字位置のインデックスが必要です。したがって、別の簡単な解決策は、nposに独自の符号付き値を定義することです。
const int NPOS = -1;
これで、比較は少し異なり、さらに便利に見えます。
if (idx == NPOS) { // works almost always
...
}
nposは、find()が何も検出しなかったことを示す単なるトークン値です(おそらく-1またはそのようなもの)。find()は、パラメーターの最初の出現をチェックし、パラメーターが始まるインデックスを返します。例えば、
string name = "asad.txt";
int i = name.find(".txt");
//i holds the value 4 now, that's the index at which ".txt" starts
if (i==string::npos) //if ".txt" was NOT found - in this case it was, so this condition is false
name.append(".txt");
最近のC ++ 17の答えは次のとおりですstd::optional
。
あなたが少し目を細めて、ふりをしstd::string::find()
てstd::optional<std::string::size_type>
(それは一種のはずです...)を返すと、条件は次のようになります。
auto position = str.find(str2);
if ( position.has_value() ) {
std::cout << "first 'needle' found at: " << found.value() << std::endl;
}
string :: nposの値は18446744073709551615です。文字列が見つからない場合に返される値です。
18446744073709551615
は64ビットの標準値std::size_t
であり、最大64ビットの符号なしの値です。