从std :: string获取第一个char

时间:2012-04-23 19:01:46

标签: c++ string char

我需要使用最少量的代码获取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);

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

从您的问题来看,您的问题并不完全清楚,但map_settings["type"][0]可能出错的原因是返回的字符串可能为空,导致[0]时出现未定义的行为。如果没有第一个字符,你必须决定你想做什么。这是一种可行的方式。

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

它获取第一个字符或默认字符。

答案 2 :(得分:0)

c_str()方法将返回一个指向内部数据的指针。如果字符串为空,则返回指向NULL终止的指针,因此简单的单行代码既安全又容易:

std::string s = "Hello";
char c = *s.c_str();

答案 3 :(得分:-1)

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