最近學習C++時,被幾種字符串搞的有點亂,這里記錄一下。
c++中有兩種風格字符串,分別是:
- C++風格字符串
- C風格字符串
它們各自的聲明方式如下:
void main(){ string a = "hello"; //C++風格 char *b = "hello"; //C風格 char c[] = "hello"; //C風格 }
C++風格字符串
string是c++標准庫定義的類型。string支持下標操作,可以修改string中的一部分。同時string可以看作存儲char的vector容器的特化,所以string支持一般的容器操作。
string a="hello“; a[3] = 's'; //支持下標操作 //通過迭代器輸出首尾元素 cout<<*a.begin(); auto e = a.end(); cout <<*(--e);
C風格字符串
C風格字符串不是一種類型,而是一種約定俗成的寫法。即字符串放在字符數組中並以空字符結束(’\0‘)。
char ca1[]={'C', '+', '+'}; //沒有以’\0'結尾,非c風格字符串 char ca2[]={'C', '+', '+', '\0'}; // 顯式添加'\0' char ca3[]="C++"; // 編譯器會自動在末尾添加空字符 char *cp="C++"; // 編譯器會自動在末尾添加空字符
其中,使用字符數組時,只能在定義的時候初始化,同時,對於字符指針型的字符串(char *str),字符數組可以直接賦值給字符指針型字符串,但反之就不行。
char[10] str_1 = "hello"; //正確 char[10] str_2;
char* str_3 = "world"; str_2 = "hello" //錯誤,此時的str_2是一個數組名,不能這樣賦值 str_2[0] = 'h'; //正確
str_3 = str_1; //正確
str_1 = str_3; //錯誤
兩種風格字符串間的轉換
在編程程序的時候,盡量使用string,但有很多時候修改老代碼的時候不得已會用到C風格字符串,所以需要用到兩種風格間字符串的轉換。
1.C風格字符串轉換為C++風格字符串
string類能夠自動將C風格字符串轉化為C++風格字符串,也就是說C風格字符串能夠直接賦值給string。
string str_1; char * str_2 = "hello"; char[] str_3 = "world“; str_1 = str_2; //正確 str_1 = str_3; //正確
2.C++風格字符串轉換為C風格字符串
這種轉換需要用到函數c_str,這個函數返回的是一個const *char類型的值。
string str_1 = "hello"; char *str_2 = str_1.c_str(); //錯誤,c_str()返回的是const char* const char* str_3 = str_1.c_str() ; //正確