文章目錄 22. 字符串 22.1. 字符數(shù)組 vs 字符指針 vs 常量字符指針 vs string 22.2. strcpy vs sprintf vs memcpy 22.3. strlen vs length vs size vs sizeof 22.4. 字符串之間的轉(zhuǎn)換 22.5 其他數(shù)據(jù)類型與字符串之間的轉(zhuǎn)換 22.6 字符串分割
22. 字符串
22.1. 字符數(shù)組 vs 字符指針 vs 常量字符指針 vs string
字符數(shù)組 char[] 它將常量字符拷貝到自己的內(nèi)存空間,再進行讀寫操作。 它的大小在編譯時確定,且固定大小。 字符指針 char* 它指向常量字符的內(nèi)存空間,不能修改字符串。 只有為它動態(tài)分配內(nèi)存,才能修改。 常量字符指針 const char* 指向常量字符的指針,不能修改字符串內(nèi)容。 【注意】 如果是 char* 或 char[] 隱式轉(zhuǎn)換成 const char* ,只是不能通過const char* 去修改,可能存在安全隱患 。示例如下。 string 是C++標準字符串類,封裝了字符串的操作和管理。
int main ( ) { char c1[ ] = "hello" ; c1[ 0 ] = 'a' ; char * p1 = "hello" ; p1[ 0 ] = 'a' ; char * p2 = new char [ 10 ] ; strcpy ( p2, "hello" ) ; p2[ 0 ] = 'a' ; const char * c = p2; c[ 0 ] = 'b' ; p2[ 0 ] = 'b' ; cout << c << endl; cout << p2 << endl; delete [ ] p2; return 0 ;
}
22.2. strcpy vs sprintf vs memcpy
相同:都可以拷貝。 區(qū)別 strcpy是字符串之間的拷貝。 sprintf是其他數(shù)據(jù)類型到字符串的轉(zhuǎn)化。 memcpy是內(nèi)存塊間的拷貝。 另外,執(zhí)行效率,memcpy > strcpy > sprintf。示例如下。
struct Person
{ char name[ 20 ] ; int age;
} ; int main ( ) { char data[ 100 ] ; strcpy ( data, "hello" ) ; int num = 1234 ; sprintf ( data, "%d" , num) ; Person person = { "John" , 30 } ; memcpy ( data, & person, sizeof ( Person) ) ; return 0 ;
}
22.3. strlen vs length vs size vs sizeof
相同:都是獲取大小。 區(qū)別 strlen位于頭文件 < cstring >,獲取const char* 長度,包括 char*,char[],因為它們可以隱式轉(zhuǎn)換成const char*。 length獲取string長度。 size除了獲取string長度,還可以獲取容器長度。 sizeof獲取對象或類型大小,以字節(jié)為單位。示例如下。
int main ( ) { const char * ctr = "Hello" ; cout << strlen ( ctr) << endl; cout << sizeof ( ctr) << endl; string str = "Hello" ; cout << str. length ( ) << endl; cout << str. size ( ) << endl; return 0 ;
}
22.4. 字符串之間的轉(zhuǎn)換
string 轉(zhuǎn) const char*,使用c_str()。 const char* 轉(zhuǎn) char[],使用strcpy()。 string 轉(zhuǎn) char[],使用strcpy(c_str())。 const char*,char*, char[] 轉(zhuǎn) string,直接賦值。 char*, char[] 轉(zhuǎn) const char*,隱式轉(zhuǎn)換。
22.5 其他數(shù)據(jù)類型與字符串之間的轉(zhuǎn)換
const char* 轉(zhuǎn) int、long和double,分別使用atoi、atol、atof。 string 轉(zhuǎn) int、long、long long、float、double、long double,分別使用stoi、stol、stoll、stof、stod、stold。 數(shù)值類型 轉(zhuǎn) string,使用to_string。
22.6 字符串分割
int main ( ) { char str[ ] = "apple,banana,orange,grape" ; char * token = strtok ( str, "," ) ; while ( token != nullptr ) { printf ( "%s\n" , token) ; token = strtok ( NULL , "," ) ; } return 0 ;
}