C++:I用不同的位置调用字符串 substr 两次,转换为常量字符 *,它们返回相同的,为什么

C++:I call a string substr twice with different position, convert to const char *, they return the same,why?

本文关键字:字符 常量 为什么 转换 返回 两次 位置 substr 字符串 调用 C++      更新时间:2023-10-16

示例:

const char * aaa(string str){
    string tmp = str.substr(0,5);
    return tmp.c_str();
}
const char * bbb(string str){
    string tmp = str.substr(6);
    return tmp.c_str();
}
string str = "Hello World";
const char * ss = aaa(str);
const char * tt = bbb(str);
结果是ss="World",tt="World",

但我的期望是ss="Hello",tt="World",我不知道为什么。我希望 aaa() 和 bbb() 返回"const char*"。

使用

return tmp.c_str();

是不对的。它导致上游未定义的行为,main .

应将aaa更改为:

std::string aaa(string str){
    return str.substr(0,5);
}

您应该以类似的方式更改bbb

虽然这些修复将是好的,但期望str会改变是没有根据的。

  1. 这两个函数都按值接受其参数。他们都无法从main修改原始对象。

  2. 这两个函数都不会更改输入参数。当您调用str.substr(0, 5);时,它们会构建一个新的string