我理解c_str函数能够将一个可能为空结尾的字符串转换为以空字符结尾的字符串。
这是正确的吗?你可以举一些例子吗?
c_str
返回一个指向以 null 结尾的字符串(即 C 风格字符串)的 const char*
。当你想要将 std::string
的 "内容"¹ 传递给一个期望使用 C 风格字符串的函数时,这是非常有用的。
例如,考虑以下代码:
std::string string("Hello, World!");
std::size_t pos1 = string.find_first_of('w');
std::size_t pos2 = static_cast<std::size_t>(std::strchr(string.c_str(), 'w') - string.c_str());
if (pos1 == pos2) {
std::printf("Both ways give the same result.\n");
}
注:
¹ 这并非完全正确,因为 std::string
(与 C 字符串不同)可以包含 \0
字符。如果包含,则接收 c_str()
返回值的代码会被欺骗,认为字符串比实际要短,因为它会将 \0
解释为字符串的结尾。
在C++中,你将字符串定义为
std::string MyString;
而不是
char MyString[20];
。
在编写C++代码时,你会遇到一些需要C字符串作为参数的C函数。
像下面这样:
void IAmACFunction(int abc, float bcd, const char * cstring);
现在有一个问题。你正在使用C++并且正在使用std::string
字符串变量,但是这个C函数要求一个C字符串。如何将你的std::string
转换为标准的C字符串?
像这样:
std::string MyString;
// ...
MyString = "Hello world!";
// ...
IAmACFunction(5, 2.45f, MyString.c_str());
这就是c_str()
的作用。
请注意,对于std::wstring
字符串,c_str()
返回一个const w_char *
。
const char*
。通过STL和std::string
,引入了string.c_str()
,可以将std::string
转换为const char*
。这意味着,如果您承诺不更改缓冲区,您将能够使用只读字符串内容。 承诺=const char*。<string>
头文件,我们可以使用标准字符串。另一方面,C字符串只是普通字符数组。因此,为了将标准字符串转换为C字符串,我们使用c_str()
函数。// A string to a C-style string conversion //
const char *cstr1 = str1.c_str();
cout<<"Operation: *cstr1 = str1.c_str()"<<endl;
cout<<"The C-style string c_str1 is: "<<cstr1<<endl;
cout<<"\nOperation: strlen(cstr1)"<<endl;
cout<<"The length of C-style string str1 = "<<strlen(cstr1)<<endl;
输出结果将是:
Operation: *cstr1 = str1.c_str()
The C-style string c_str1 is: Testing the c_str
Operation: strlen(cstr1)
The length of C-style string str1 = 17
这被用于使std::string
与需要以空字符结尾的char*
形式要求的C代码相互操作。
float arr[1024];
memcpy(arr, ur_string.c_str(), sizeof(float) * 1024);
这是相当常见的用法,我想。
const char* c_str() const;
该函数返回一个指向字符数组的指针,该数组包含表示字符串对象当前值的null-terminated sequence(即C字符串)。
该数组包含与字符串对象值相同的字符序列以及在末尾附加的另一个终止空字符('\0')。
std::string str = "hello";
std::cout << str; // hello
printf("%s", str); // ,²/☺
printf("%s", str.c_str()); // hello
²/☺
?它从哪里来的? - Peter Mortensen
char const*,size_t
),第二个参数是大小。 - Matthieu M.string str("0.85"); newVolume = _tstof((TCHAR*)str.c_str());
我该如何将TCHAR* argv[]
输入的 0.85 转换成那种格式? - user285594std::string
与TCHAR混用,因为TCHAR的整个意义在于自动在char/wchar之间切换,而std::string
仅以char为单位。你必须使用适当的抽象,或者干脆不使用TCHAR,始终进行Unicode构建。 - Jon