什么是c_str函数的用法在c ++中

时间:2011-09-14 12:37:49

标签: c++ c string

我刚开始阅读C ++并发现c ++具有丰富的字符串操作功能,而C语言没有。我正在阅读这些函数并遇到c_str()并且根据我的理解c_str转换一个字符串,该字符串可能为空终止或者可能不是以空终止的字符串。这是真的吗?

任何人都可以建议我一些例子,以便我能理解 c_str 函数的使用吗?

8 个答案:

答案 0 :(得分:70)

c_str返回指向以空字符结尾的字符串(即C样式字符串)的const char*。当你想将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");
}

<强> See it in action

注意:

¹这不完全正确,因为std::string(与C字符串不同)可以包含\0字符。如果是这样,接收返回值c_str()的代码将被误认为字符串比实际更短,因为它会将\0解释为字符串的结尾。

答案 1 :(得分:43)

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

答案 2 :(得分:6)

大多数OLD c ++和c函数在处理字符串时使用const char* 使用STL和std::string,我会引入string.c_str(),以便能够从std::string转换为const char*

这意味着如果您保证不更改缓冲区,您将能够使用只读字符串内容。 PROMISE = const char *

答案 3 :(得分:3)

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

答案 4 :(得分:3)

它用于使std::string与需要空终止char*的C代码互操作。

答案 5 :(得分:3)

在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

答案 6 :(得分:0)

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

让我们说您使用base64encode在python中对某个数组进行编码,然后将其解码为c ++。一旦有了字符串,就可以在c ++中从base64decode解码。为了使它回到float数组,您要做的只是

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

我想这是很普遍的用途。

答案 7 :(得分:0)

const char* c_str() const; 返回一个指向数组的指针,该数组包含一个以空字符结尾的字符序列(即一个C字符串),表示当前的值字符串对象。

该数组包含组成字符串对象值的相同字符序列加上一个额外的终止空字符(< strong>'\0') 结尾。

std::string str = "hello";
std::cout << str;          // hello
printf("%s", str);         // ,²/☺
printf("%s", str.c_str()); // hello