低價網(wǎng)站建設(shè)哪家便宜seo關(guān)鍵詞優(yōu)化公司
前言
本篇文章記錄的是一些關(guān)于string的補充說明
string與const char*之間的相互轉(zhuǎn)換
const char* 轉(zhuǎn)換成string
在C++中存在著從const char到string的隱式類型轉(zhuǎn)換,換句話說,如果一個函數(shù)的參數(shù)類型是string類,直接傳入const char類型的參數(shù)是沒問題的
const char* cstr = "demo";
string str(cstr);
string與const char*的轉(zhuǎn)換
在傳入?yún)?shù)時i,有時我們傳入string在編譯時是會報錯的,所以我們就需要傳入const char* 類型
我們可以使用成員函數(shù)c_str(),來返回string對應(yīng)的char數(shù)組
string str = "demo";
const char* cstr = str.c_str();
并且,在進行文件讀寫的時候,使用const char* 比使用string更安全
因為,string是會自動分配內(nèi)存的,其內(nèi)部的存儲方式是不可見的
而const char*類型是整存整取的,或者也可以自己手動存入每一部分
注意
為了修改string字符串的內(nèi)容,下標訪問操作符[]和函數(shù)at都會返回字符串中某個字符的引用,但當字符串的內(nèi)存被重新分配之后,可能會發(fā)生錯誤
此處給出一個例子(string內(nèi)部的內(nèi)存分配機制)方便理解:
字符串str中有十個元素,當我想往里面復(fù)制11個元素時,先復(fù)制了10個元素,在放第十一個元素的時候,原字符串不夠放,那就會在堆區(qū)的另一個地方找一個更大的位置,比如找了一個能存放20個元素的位置,
首先,會之前存儲的10個元素拷貝到新的空間里,之后再將第11個元素存儲到后面,最后將之前存儲10個元素的空間釋放掉
那么,當我想通過之前的引用找到原來對應(yīng)的字符時,就會發(fā)生未知的錯誤
大小寫轉(zhuǎn)換
在C語言中,我們只能通過循環(huán)來改變每個字符,利用ASCII碼值或者toupper/tolower函數(shù)將其轉(zhuǎn)換成大寫或小寫
而使用STL的話,一行就能解決這個問題
在STL算法庫中,已經(jīng)將這種遍歷修改的過程進行了封裝
我們可以直接復(fù)用:
transform(str.begin, str.end(), str.begin(), toupper);
//字符串轉(zhuǎn)大寫transform(str.begin(), str.end(), str.begin(), tolower);
//字符串轉(zhuǎn)小寫
這里面的算法就是transform算法,包含四個參數(shù)
前兩個參數(shù)是源容器的首未迭代器
第三個參數(shù)是目標容器的首迭代器
第四個參數(shù)是函數(shù)指針,也就是要執(zhí)行的操作
之后會有對于迭代器的解釋和學習,在這里會用就行
字符串和數(shù)字之間的轉(zhuǎn)換
實數(shù)轉(zhuǎn)字符串
在C++11新標準中,提供了全局函數(shù)std::to_string
可以將類型轉(zhuǎn)換成string類型
下面給出一些例子
將帶符號 / 不帶符號整數(shù)和實數(shù)轉(zhuǎn)換成字符串
string to_string(int val);string to_string(long val);string to_string(long long val);string to_string(unsigned int val);string to_string(unsigned long val);string to_string(unsigned long long val);string to_string(float val);string to_string(double val);string to_string(long double val);
字符串轉(zhuǎn)實數(shù)
int stoi(const string& str, size_t* idx = 0; int base = 10);long stol(const string& str, size_t* idx = 0, int base = 10);long long stoll(const string& str, size_t* idx = 0, int base = 10);
補充說明
1.
idx返回字符串中第一個非數(shù)字的位置,即數(shù)值部分的結(jié)束位置
2.
base為進制,10就是10進制,8就是8進制
3.
該組函數(shù)會自動保留符號和自動去除前導0
C風格字符數(shù)組轉(zhuǎn)換成實數(shù)
在C語言中,也提供了一些函數(shù)來幫助我們將字符數(shù)組轉(zhuǎn)換成實數(shù)
int atoi(const char* str);long atol(const char* str);long longstoll(const char* str);double atof(const char* str);
注意:
atof函數(shù)中的f指的是浮點數(shù)(包含float、double、long double類型),atof函數(shù)的返回類型是double
結(jié)語
關(guān)于string的補充說明到這里就結(jié)束了,
之后我會出一些刷題的筆記以及C++相關(guān)知識的學習和介紹
我們下篇文章見~