C++:我用不同的位置两次调用一个字符串 substr,转换为 const char *,它们返回相同,为什么?

标签 c++ string

例子:

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

关于C++:我用不同的位置两次调用一个字符串 substr,转换为 const char *,它们返回相同,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35472404/

相关文章:

c - C中的只读字符串

c++ - C++ 中的高效字符串连接

c++ - 高效过滤一串文本中的单词

c++ - QuantLib 多线程/并发

c++ - GetAsyncKeyState(int vKey) 中的点逗号减号

c++ - 在 Windows 上获取套接字超时值

c++ - 我们是否应该从派生类调用基类移动复制/赋值构造函数

java - 如何查看字符串的第一个字符是否是某个字符,如果是,则执行操作(无法正常工作)

在 C 中将 char * 转换为大写

c# - 有效地检查 List<List<int>> 中的数字是否仅以正数或负数存在