c ++中c_str函数的用途是什么


76

我刚刚开始阅读C ++,发现c ++具有丰富的字符串操作功能,而C语言则没有。我正在阅读这些函数并且遇到了c_str(),据我所知是c_str将可能以null终止或可能不是null终止的字符串转换为字符串。

谁能建议我一些示例,以便我可以理解c_str函数的使用?

Answers:


90

c_str返回一个const char*指向以空字符结尾的字符串(即C样式的字符串)的a。当您想要将an的“内容”¹传递std::string给希望使用C样式字符串的函数时,此功能很有用。

例如,考虑以下代码:

std::string str("Hello world!");
int pos1 = str.find_first_of('w');

int pos2 = strchr(str.c_str(), 'w') - str.c_str();

if (pos1 == pos2) {
    printf("Both ways give the same result.\n");
}

看到它在行动

笔记:

¹这并不完全正确,因为std::string(不同于C字符串)可以包含\0字符。如果确实如此,则接收到返回值的代码c_str()将被认为是字符串短于实际长度,因为它将被解释\0为字符串的结尾。


您在Notes中提出的非常有趣的一点是:我想知道std :: string是否已经包含\ 0,然后c_str还要在字符串末尾附加\ 0吗?
阿米特·辛格·托马尔

2
@AmitSinghTomar:是的,所以您将有两个空字节-一个合法地是字符串的一部分,另一个应该是空终止符。但是接收指针的c样式函数不知道这一点。
乔恩

注意:许多C-API会要求两个参数(char const*, size_t),当然第二个是大小。
Matthieu M.

这是行不通的:string str("0.85"); newVolume = _tstof((TCHAR*)str.c_str());如何将TCHAR * argv []输入0.85转换为该值?

1
@YumYumYum不能std::string与TCHAR东西一起使用,TCHAR的全部目的是在char / wchar之间自动切换,而std::string仅在char方面起作用。您将必须使用适当的抽象,或者只是根本不使用TCHAR并始终执行Unicode构建。
乔恩

55

在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 *


8

大多数OLD c ++和c函数在处理字符串时都使用const char*
借助STL和std::stringstring.c_str()可以将转换std::stringconst char*

这意味着,如果您承诺不更改缓冲区,则可以使用只读字符串内容。承诺= const char *


@没有这样的东西stl::string。实际上,除了某处的博物馆之外,甚至没有“ STL”之类的东西。
Kerrek SB 2011年

6

c_str()将C ++字符串转换为C样式的字符串,该字符串本质上是一个以null终止的字节数组。当您要将C ++字符串传递到需要C样式字符串的函数中时,可以使用它(例如,许多Win32 API,POSIX样式函数等)。


3
我不会说“转换”。而是,该函数“提供对适当的只读字符数组的访问”-很有可能是在实施时始终存在的数组std::string
Kerrek SB 2011年

5

它用于std::string与需要以null结尾的C代码进行互操作char*


5

在C / C ++编程中,有两种类型的字符串:C字符串和标准字符串。通过<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

1

哦,必须在这里添加我自己的选择,在对在两个程序之间传输的某些字符串obj进行编码/解码时,将使用此代码。

假设您在python中使用base64encode一些数组,然后要将其解码为c ++。一旦有了字符串,就可以使用c ++从base64decode解码。为了将其返回到float数组,您需要做的就是

float arr[1024];
memcpy(arr, ur_string.c_str(), sizeof(float) * 1024);

我想这是很普遍的用法。


这类代码不可移植(字节序和浮点格式等)
Phil1970 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.