2012-04-23 19 views
1

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

STL std::map<std::string, std::string> map_of_stringsから、1行のコードで最初の文字を取得することが可能なのは素晴らしいことです。正しい次のコードです:

map_of_strings["type"][0] 

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

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

set_type関数のプロトタイプは次のとおりです。あなたがmap_of_strings["type"]に非空の文字列を入れている場合は動作するはずです

void set_type_nomutex(const char type); 
+10

「機能しません」は問題の説明ではありません。 –

+0

「正しく動作しません」という意味は?何が起こった?何が起こると思いますか? –

+0

プロトタイプが正しいと確信していますか?マップのキーとして 'type'を使用している場合は、コンパイルエラーが発生しているはずです。 –

答えて

2

それはあなたの問題が何であるか、あなたの質問から必ずしも明らかではないが、事はそうmap_settings["type"][0]で間違っているのは、返された文字列が空であり、[0]を実行したときの動作が未定義であるということです。最初の文字がない場合は、何をしたいかを決める必要があります。ここでは、1行で動作する可能性があります。

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

-1
string s("type"); 
char c = s.at(0); 
+1

注意 '.at(0)'は空の文字列に対して 'out_of_range'例外をスローします。それ以外の場合は 'operator []'と同じ動作です – AJG85

5

。そうしないと、空の文字列が返され、その内容にアクセスするとクラッシュする可能性があります。

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] 
    } 
} 

または:あなたがマップに空の文字列を追加しないようにしたい場合は、

std::string const & type = map["type"]; 
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); 
関連する問題