我通常会发现一些将char*
作为其参数的函数。但是我听说在C++中推荐使用std::string
。怎样才能够将一个std::string
对象用于需要char*
作为参数的函数中呢?目前,我已经知道了c_str()
函数,但是它不能够在需要修改字符串内容时使用。
我通常会发现一些将char*
作为其参数的函数。但是我听说在C++中推荐使用std::string
。怎样才能够将一个std::string
对象用于需要char*
作为参数的函数中呢?目前,我已经知道了c_str()
函数,但是它不能够在需要修改字符串内容时使用。
为此,您可以使用 std::string::data()
。返回指向内部数据的指针。请注意不要释放此内存或类似行为,因为该内存由字符串对象管理。
C++11
后的第一个元素的地址:void some_c_function(char* s, int n);
// ...
std::string s = "some text";
some_c_function(&s[0], s.size());
C++11
之前,内部字符串存储在连续缓冲区中或者它是否以空字符结尾都没有保证。在这些情况下,复制字符串是唯一安全的选择。
C++17
(当前标准)之后,您可以使用以下代码:
some_c_function(s.data(), s.size());
some_c_function
将在“缓冲区”中留下一个以'\0'
结尾的C风格字符串。之后需要调整字符串大小,因为其大小包括'\0'
和其余尾随空闲“缓冲区”。 - EljayC
函数可能会做什么。一些遗留函数不修改字符串,只是在使用const
时比较宽松。此外,许多函数只是填充字符串缓冲区并返回已填充的长度。可能存在替代结束值(例如 \n
)等... - Galik'\0'
可能只是数据(仅用于输入、输入/输出或仅输出缓冲区)。它可能只是一个 C 风格的字符串输入(因此大小应该无关紧要)。它可能是一个 C 风格的字符串输出缓冲区,因此大小作为缓冲区限制以防止溢出非常重要。这完全取决于 API。 - Eljayc_str()
的实现变得简单。因此,当C++11更改要求需要连续性和空终止时,大多数实现已经符合规定(这可能是C++11首先进行更改的原因之一,即使常见做法标准化)。 - Remy Lebeaustd::string::data()
返回指向底层 char
数组的指针,允许修改字符串内容。然而,与字符串一般情况相同,您不能写入超出其结尾的内容。从cppreference得知: