cpp-如何只获取c_str()

时间:2016-04-03 11:24:27

标签: c++ string c-str

我有一个返回const char*的函数。 在这个函数中,我有以下参数:

string str;

为了将str转换为const char*,我使用str.c_str()

当我调试时,我注意到str.c_str()在字符串的值之前包含某些内容(我猜它的地址)。 例如: 如果str =" 0" 我str.c_str() wiil 0x68d5f9" 0"。 为什么? 我怎样才能得到字符串的值?

2 个答案:

答案 0 :(得分:1)

这个不是问题,这就是指针的工作方式。

指针指向某些内存地址中包含的数据,调试器显示此指针指向地址0x<something>,此地址的值为'0'。这里没什么奇怪的。

当您从str.c_str()打印此值时,您将获得一个普通的C字符串。

cout << str.c_str();

这将与cout << str;

相同

答案 1 :(得分:0)

你不会得到c_str返回的字符串中指针指向的地址。它是一个调试器工件,旨在让程序员检查地址和值。

但是,如果对函数范围的字符串进行调用,则返回c_str的结果可能是未定义的行为。

例如,这是非法的:

const char *illegal_return() {
    string s = "quick brown fox";
    return s.c_str(); // <<== Return of c_str from a local string
}

最好的解决方法是返回string。如果您想要返回char指针,则需要复制:

char *legal_return() {
    string s = "quick brown fox";
    const char *ptr = s.c_str();
    size_t len = strlen(ptr);
    char *res = new char[len+1];
    strcpy(res, ptr);
    return res;
}

上述函数的调用者必须在结果上调用delete[]以避免内存泄漏。