84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
c++ 自带string类 的对象 字符串结尾带不带‘0’?
人生最曼妙的风景,竟是内心的淡定与从容!
先上圖
string 類型把' 0'當做普通字符處理,長度加一,可見' 0'不是結束字符,不含有特殊功能,string末尾不需加' 0'
C語言中沒有string類型,而是用字元陣列代替,一般字元陣列可以不確定長度char * string = " ABCD" ,編譯器靠什麼知道字串結束,一般在後面加' 0 '
C++ 中的std::string和 C-style string 是兩種不同的字串,前者是標準函式庫中定義的一個類,後者是字元陣列的別名。
std::string
C-style string:通常以
0是C語言中的字元陣列作為結束標記用的,C++字串沒有這個需要
何不建立string對象,列印看看他的size?
c語言用char*指標當字串時,在讀取字串時需要一個特殊字元0來標記指標的結束位置,也就是通常認為的字串結束標記。 而c++語言則是物件導向的,長度資訊直接被儲存在了物件的成員中,讀取字串可以直接根據這個長度來讀取,所以就沒必要需要結束標記了。而且結束標記也不利於讀取字串中夾雜0字元的字串。
参照std::string的实现 bits/basic_string.h
String本身是封裝過的,會把'
#include <iostream> #include <stdio.h> #include <string> using std::string; using namespace std; void test1(){ string s1 = "Hello"; const char * v1 = s1.data(); printf("0x%.2x\n", v1[s1.size()]); string *s2 = new string("Hello"); const char * v2 = s2->data(); printf("0x%.2x\n", v2[s2->size()]); } void test2(){ string s1 = "Hello"; const char * v1 = s1.c_str(); printf("0x%.2x\n", v1[s1.size()]); string *s2 = new string("Hello"); const char * v2 = s2->c_str(); printf("0x%.2x\n", v2[s2->size()]);; } int main() { test1(); test2(); return 0; }
先上圖
string 類型把' 0'當做普通字符處理,長度加一,可見' 0'不是結束字符,不含有特殊功能,string末尾不需加' 0'
C語言中沒有string類型,而是用字元陣列代替,一般字元陣列可以不確定長度
char * string = " ABCD" ,編譯器靠什麼知道字串結束,一般在後面加' 0 '
C++ 中的
std::string
和 C-style string 是兩種不同的字串,前者是標準函式庫中定義的一個類,後者是字元陣列的別名。C-style string:通常以
0是C語言中的字元陣列作為結束標記用的,C++字串沒有這個需要
何不建立string對象,列印看看他的size?
c語言用char*指標當字串時,在讀取字串時需要一個特殊字元0來標記指標的結束位置,也就是通常認為的字串結束標記。
而c++語言則是物件導向的,長度資訊直接被儲存在了物件的成員中,讀取字串可以直接根據這個長度來讀取,所以就沒必要需要結束標記了。而且結束標記也不利於讀取字串中夾雜0字元的字串。
String本身是封裝過的,會把'
輸出都是0x00