1

std::string最小限のコードでの最初の文字を取得する必要があります。

STL から 1 行のコードで最初の char を取得できれば素晴らしいことstd::map<std::string, std::string> map_of_stringsです。次のコードは正しいですか:

map_of_strings["type"][0]

編集 現在、私はこのコードを使用しようとしています。このコードは正しいですか?

if ( !map_of_strings["type"].empty() )
    ptr->set_type_nomutex( map_of_strings["type"][0] );

set_type関数のプロトタイプは次のとおりです。

void set_type_nomutex(const char type);
4

4 に答える 4

5

空でない文字列をに入れた場合、これは機能するはずですmap_of_strings["type"]。そうしないと、空の文字列が返され、その内容にアクセスするとクラッシュする可能性があります。

文字列が存在するかどうかわからない場合は、次のことをテストできます。

std::string const & type = map["type"];
if (!type.empty()) {
    // do something with type[0]
}

または、マップに空の文字列を追加しないようにする場合は、次のようにします。

std::map<std::string,std::string>::const_iterator found = map.find("type");
if (found != map.end()) {
    std::string const & type = found->second;
    if (!type.empty()) {
        // do something with type[0]
    }
}

atまたは、範囲チェックを実行し、文字列が空の場合に例外をスローするために使用できます。

char type = map["type"].at(0);

または、C ++ 11では、マップにも同様のatものがあり、空の文字列の挿入を回避するために使用できます。

char type = map.at("type").at(0);
于 2012-04-23T19:13:19.013 に答える
2

あなたの問題が何であるかはあなたの質問から正確には明らかではありませんが、間違っている可能性が高いmap_settings["type"][0]のは、返された文字列が空である可能性があり、実行すると未定義の動作が発生することです[0]. 最初のキャラクターがいない場合は、何をしたいかを決める必要があります。これは、単一行で機能する可能性です。

ptr->set_type_nomutex( map_settings["type"].empty() ? '\0' : map_settings["type"][0]);

最初の文字またはデフォルトの文字を取得します。

于 2012-04-23T19:19:05.567 に答える
0
string s("type");
char c = s.at(0);
于 2012-04-23T19:05:46.940 に答える