const value_type *c_str( ) const;
const value_type *data( ) const;
<wbr></wbr>
data只是返回原始数据序列,没有保证会用traits::eos(),或者说'\0'来作字符串结束. <wbr> 当然,可能多数实现都这样做了。<wbr><wbr><wbr><br>
c_str是标准的做法,返回的char*<wbr> 一定指向一个合法的用'\0'终止的C兼容的字符串。<wbr><wbr><wbr><br>
所以,如果需要C兼容的字符串,c_str是标准的做法,data并不保证所有STL的实现的一致性。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>
你或许会问,c_str()的功能包含data(),那还需要data()函数干什么?看看源码:
const charT* c_str () const
{
<wbr><wbr> if<wbr> (length () == 0)</wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>return "";</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>terminate ();</wbr></wbr></wbr>
<wbr><wbr><wbr>return data ();</wbr></wbr></wbr>
}
原来c_str()的流程是:先调用terminate(),然后在返回data()。因此如果你对效率要求比较高,而且你的处理又不一定需要以\0的方式结束,你最好选择data()。但是对于一般的C函数中,需要以const char*为输入参数,你就要使用c_str()函数。
对于c_str() data()函数,返回的数组都是由string本身拥有,千万不可修改其内容。其原因是许多string实现的时候采用了引用机制,也就是说,有可能几个string使用同一个字符存储空间。而且你不能使用sizeof(string)来查看其大小。详细的解释和实现查看Effective STL的条款15:小心string实现的多样性。
另外在你的程序中,只在需要时才使用c_str()或者data()得到字符串,每调用一次,下次再使用就会失效,如:
string strinfo("this is Winter");
...
//最好的方式是:
foo(strinfo.c_str());
//也可以这么用:
const char* pstr=strinfo.c_str();
foo(pstr);
//不要再使用了pstr了, 下面的操作已经使pstr无效了。
strinfo += " Hello!";
foo(pstr);//错误!
会遇到什么错误?当你幸运的时候pstr可能只是指向"this is Winter Hello!"的字符串,如果不幸运,就会导致程序出现其他问题,总会有一些不可遇见的错误。总之不会是你预期的那个结果。
分享到:
相关推荐
这里的`str1`会将`data`数组视作C风格字符串,即遇到第一个空字符('\0')时停止复制,因此`str1`只包含字符'A'和'b'。而使用以下语句创建的`str2`则包含了整个数组: ```cpp string str2(data, sizeof(data)); ``` ...
在C++标准库中,`std::string` 类型提供了几个方法来访问其内部存储的字符序列,其中包括 `c_str()`, `data()` 和 `copy(p, n)`。这三个函数在处理字符串时非常常用,但它们各有不同的特性和用途。 1. `c_str()` ...
const char *src_data = src_info.c_str(); char *out_data_ptr = NULL; int total_byte = FillData(src_data, strlen(src_data), &out_data_ptr); char * data_BIT_OF_GROUP = out_data_ptr; for (int i = 0; ...
- **String:** `_str` (例如:`name_str`) - **TextField:** `_txt` (例如:`info_txt`) - **TextFormat:** `_fmt` (例如:`font_fmt`) - **XML:** `_xml` (例如:`data_xml`) - **XMLSocket:** `_xmlsocket` (例如...
标题中的"template-test:as,string_to_be_changed,悲伤"似乎是一个模板字符串,其中包含了占位符`as`和`string_to_be_changed`,而`悲伤`可能是一个情感词汇,用于表达当前情境的情感色彩。在Python编程中,模板...
if ((wide_str[pos].data()[byte_pos] & 0xC0) != 0x80) { break; // 找到当前字符的字节边界 } } pos += byte_pos; } } return wstring_to_utf8(wide_str.substr(0, pos)); } ``` 这个示例首先将UTF-8字符...
- 使用`c_str()`或`data()`方法:`char* str_c = myString.c_str();` 2. `char*`转`string`: - 构造函数:`std::string str = myCharPtr;` 或 `std::string str(myCharArray);` `char`类型通常用于单个字符的...
`__str__`方法(代表string representation)则是为了提供面向用户的、友好的字符串表示。当使用`print`语句或者`str()`函数时,Python会调用`__str__`方法。这个方法通常返回一个适合人阅读的字符串,不需要包含...
- `data()`: 同`c_str()`,但可以修改。 9. **流操作**: - 可以与`std::istream`和`std::ostream`进行IO操作,例如`std::cin >> str`和`std::cout << str`。 10. **其他实用函数**: - `swap(string& str)`: ...
str_list = file_str.split("\n") for i in range(len(str_list)): if str_list[i] != "\n": output += str_list[i] else: final_list.append(output) output = "" final_list.append(output) tmp_list = ...
MyString(const char* str = "") : data_(str) {} // 普通构造函数 private: std::string data_; }; ``` 这里,`MyString`类通过指针`str`初始化`data_`成员,如果未提供参数,则默认为空字符串。 **拷贝构造...
- 指定大小的构造:`std::string(size_t n, char c)`创建长度为n的字符串,所有字符都是c。 - 从字符数组构造:`std::string(const char* s)`创建一个字符串,内容与字符数组s相同。 - 从另一个字符串复制:`std:...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言(包括C、C++、C#、Java、JavaScript、Perl、Python等)的习惯,这使得JSON成为理想的...
注意不要与 `<string.h>` 混淆,后者是C语言的字符串头文件。正确的引入方式如下: ```cpp #include <string> ``` **2. 声明 `string` 变量** 声明一个 `string` 变量非常简单,只需使用关键字 `string` 跟上变量...
- `data()`: 类似于`c_str()`,但返回的指针不保证以'\0'结束,需注意。 8. **`string_replace`示例**: `string_replace`函数通常用于在字符串中查找并替换特定子串。它可能使用`find`和`replace`组合实现,例如...
`c_str`函数将`string`转换为C风格的字符串,即`const char*`。这在需要与不支持`std::string`的旧式API交互时很有用。例如: ```cpp std::string str = "C Style"; const char* cStr = str.c_str(); ``` #### 6. `...
- `std::string(const char* str)`:使用C风格字符数组初始化字符串。 - `std::string(const std::string& other)`:拷贝构造函数,复制另一个`std::string`对象的内容。 2. **赋值与操作** - `operator=`:赋值...
unicode_str = converter.from_bytes(temp.data(), temp.data() + temp.size()); return unicode_str; } ``` 在VS2005中,你可以创建一个新的C++项目,将上述代码放入源文件中,然后使用提供的`gb2312_to_...
* 将内容以C_string返回:`c_str()` * 将内容以字符数组形式返回:`data()` * 返回某个子字符串:`substr()` * 查找函数 * 迭代器支持:`begin()`, `end()`, `rbegin()`, `rend()` * 返回配置器:`get_allocator()` ...
互联网 Java 工程师基础知识完全扫盲 总结内容大部分来自于网络和实际笔试和面试经验,内容涵盖、、、、、SpringBoot/SpringCloud、Mybatis、Kafka、Zookeeper、MySql、Redis、JVM ...8. String str="i"与 S