2016-07-31 80 views
2

虽然我知道转换const char *char *在C/C几乎禁止++,因为很多问题,我在一个情况下,我认为我必须const char *转换为char *赶上了。为const char *为char *在我的情况

我使用c_str作为字符串从文本文件中获取字符串,我想修改此字符串。但问题是,c_str将字符串转换为const char *。那么在这种情况下使用strdup是个不错的选择,还是有更好的主意?

+3

不要使用'c_str'。使用'&s [0]'。 –

+1

最好的方法是复制,修改副本,然后创建一个新的字符串。当然,这保证了性能成本的正确性。如果保持相同的长度,您也可以执行之前的评论。缩短是实现定义的,延长是未定义的。 –

+0

非常感谢!是的,我会保持相同的长度。 @KerrekSB为什么使用&s [0]比c_str更好? – wannaqc

回答

2

其实,你可以直接修改的std :: string对象,如下面的小程序说明:

int main() 
{ 
    std::string s("Hello World"); 
    for(char& c : s) 
    { 
     c = toupper(c); 
    } 
    s[0] = 'h'; 
    s[6] = 'w'; 
    s.resize(12); 
    s[11] = '!'; 
    std::cout << s; 
    return 0; 
} 

我认为,这是自我解释。虽然你提到尺寸没有改变,但我也为这种情况添加了一个例子,请参阅resize。还有其他方法来操作字符串,例如insert。看看std::string文档。

+0

谢谢!我使用你的解决方案解决了问题:) – wannaqc

0

为什么使用& s [0]比c_str好?

std :: basic_string类有data()c_str()。但是,正如您所知,这些函数的结果类型为const CharType*(CharType:charwchar_t,char16_t,char32_t)。

有两种方法可以获得CharType*

  1. 使用const_cast。但是,这是非常肮脏的破解类型系统。
  2. 使用&s[0]operator[]不破解类型系统。

    #include <string> 
    #include <type_traits> 
    int main(){ 
        std::string s1 = "Hello world"; 
        static_assert(std::is_same<char&, decltype(s1[0])>::value, "err"); 
        static_assert(std::is_same<char*, decltype(&s1[0])>::value, "err"); 
        const std::string s2 = "Hello world"; 
        static_assert(std::is_same<const char&, decltype(s2[0])>::value, "err"); 
        static_assert(std::is_same<const char*, decltype(&s2[0])>::value, "err"); 
    }