交换const char *和std :: string

时间:2011-10-26 21:37:32

标签: c++ stl

我正在重构一个旧的C库,我正在更改外部API,以便它使用std :: string而不是const char *。

ColumnType Table::getColType(const char *name) const
{
    int id = getColumnId(name) ;
    return getColType(id) ;
}

and

int Table::getColumnId (const char * col_name) const
{
    unsigned int i = 0;

    while ((i < m_table.num_cols) && (strcmp(m_table.cols[i]->name, col_name) != 0) )
        i++;

    if (i < m_table.num_cols)
        return i;
    else
        return -1;
}

要:

ColumnType Table::getColType(const std::string& name_in) const
{
    const char* name = name_in.c_str();
    int id = getColumnId(name) ;
    return getColType(id) ;
}

and 

int Table::getColumnId (const std::string& col_name_in) const
{
    const char* col_name = col_name_in.c_str();
    unsigned int i = 0;

    while ((i < m_table.num_cols) && (strcmp(m_table.cols[i]->name, col_name) != 0) )
        i++;

    if (i < m_table.num_cols)
        return i;
    else
        return -1;
}

在新代码中,我将const char *传递给现在期望引用const std :: string的函数。我知道std :: string可以从const char *初始化,代码编译正确(没有警告等)。

但我只是想确保我没有做任何会在以后咬我(I18n问题)的事情。

简而言之 - 正在做什么“安全”?

3 个答案:

答案 0 :(得分:1)

1)getColType中不需要从std :: string获取c_str(),只需传递std :: string&amp;直接进入getColumnId。

2)您应该使用被覆盖的equality operator或直接使用std::string::compare而不是strcmp。见

答案 1 :(得分:1)

这是安全的,只要正确执行,它不应该造成任何伤害。

尽管如此,我认为除非你能指出实质性的好处,否则我不建议继续这样做。

更安全的是添加一个接受const string&的函数,并直接传递给const char*函数。这样,您就可以让客户保持std::string&代码而不修改内部。

例如:

ColumnType Table::getColType(const std::string& name_in) const
{
    return getColType(name_in.c_str());
}

答案 2 :(得分:0)

小心std::string s包含NULL。 C ++类对它们很好; NULL并不特别。但C字符串当然将其视为字符串结尾。以下相同:

if (std_string_a == std_string_b) { /* C++ way */ }

// vs.

const char *cstring_a = std_string_a.c_str(),
           *cstring_b = std_string_b.c_str();
if (0 == strcmp(a, b)) { /* C way */ }

当你混合搭配时,你必须担心当C ++方式错误时会出现奇怪的错误,但C方式却是真的。