2012-04-23 100 views
1

我需要使用最少量的代碼獲取std::string的第一個字符。從std :: string獲取第一個字符

如果能夠從STL 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); 
+10

「不起作用」不是問題描述。 – 2012-04-23 19:03:57

+0

你是什麼意思「不能正常工作」?發生了什麼?你期望會發生什麼? – 2012-04-23 19:03:59

+0

你確定原型是正確的嗎?如果你使用'type'作爲map的鍵,你應該得到一個編譯錯誤。 – 2012-04-23 19:04:20

回答

2

這不是從你的問題你的問題是什麼十分清楚,但事情可能map_settings["type"][0]出錯是因爲返回的字符串可能爲空,導致在您執行[0]時出現未定義的行爲。如果沒有第一個字符,你必須決定你想要做什麼。這是一種可能性,可以在單一行中起作用。

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

它獲取第一個字符或默認字符。

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

注意'.at(0)'會爲空字符串拋出一個'out_of_range'異常。否則,它與'operator []'的行爲相同 – AJG85 2012-04-23 19:10:25

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); 
相關問題