cpp如何只获取c_str()的值
cpp-how to get only the value of c_str()
我有一个返回const char*
的函数。在这个函数中,我有以下参数:
string str;
为了将str转换为const char*
,我使用str.c_str()
。
当我调试时,我注意到str.c_str()
在字符串值之前包含一些内容(我猜是它的地址)。例如:如果str="0"I str.c_str()
wiil 0x68d5f9"0"。为什么?如何只获取字符串的值?
这不是问题,这就是指针的工作方式。
指针指向某个内存地址中包含的数据,调试器显示此指针指向地址0x<something>
,此地址的值为'0'
。这里没什么奇怪的。
当您打印这个从str.c_str()
得到的值时,您将得到一个普通的C字符串。
cout << str.c_str();
这将为您提供与cout << str;
相同的
在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[]
,以避免内存泄漏。
相关文章:
- 数组索引的值没有增加
- 'short int'持有的值溢出,但"自动"不会溢出?
- 是默认情况下分配给char数组常量的值
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 为什么我无法更改"set<set>"循环中的值<int>
- 有效地使用std::unordered_map来插入或增加键的值
- <streamsize>C++ 中 numeric_limits::max() 的值
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 无法获取webot::PositionSensor对象中位置传感器的值
- 正在将无序映射设置为无序映射的值
- 着色器纹理值与创建纹理时写入的值不同
- 无法按cpp中的值返回矢量
- 指针没有更新它在void函数内部指向的值
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 如何在c++中获取要更新的值
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?