最近在學C++以及STL,打個基礎
參考:
c++中的char[] ,char* ,string三種字符串變量轉化的兼容原則
c++讀取字符串和字符的6種函數
字符串結構
首先明確三種字符串結構的兼容關系:string>char*>char []
- string最靈活,內置增刪查改函數和運算符
- char*可以改變指向內容(改變記錄的地址),還算靈活,
- char[]是const類型,內容即記錄的地址不可以變(指向空間的內容可以修改),純粹的數組
在后續的函數中,string也會對char有兼容。在實際應用中優先把char轉string,極個別要用到char*的就反向轉換,string.c_str()函數會返回一個指向string儲存字符串的const char*指針,但要注意這不是拷貝,如果要復制一份(也就是轉換格式),就要用strcpy(c,s.c_str())拷貝副本到c里面
讀取函數辨析
我將讀入函數分成如下幾類:
- 常用的:
- char ch=cin.get(),相當于char ch=getchar(),單字符讀取,來者不拒
- cin>>char* ch,相當于sacnf(“%s”,char* ch),一般讀取,清理最開始的連續分隔符,讀取字符串后遇到任意分隔符停止,且保留后續分隔符在緩沖區
- 定界讀取,兩個函數都會丟棄結尾分隔符
- cin.getline(char* ch,總長度,結束字符=‘\n’),定界讀取,遇到自定義分隔符停止,丟棄分隔符,總長度含\0。注意,此總長度實際上并不會限制讀入,如下圖,會一次性讀入1234567,之后丟棄超出長度的內容
- getline(數據源,string),定界讀取,遇到\n停止,丟棄分隔符。注意,此函數來自string庫,第二個參數必須是string類,其長度不限,更加靈活安全
- 定長讀取,但是因為還會受到\n分隔符影響,實際不太好用
- cin.get(arr,總長度),定長讀取,總長度含\0。注意:此函數無法連用,遇到\n會停止,關鍵是其不清理\n,如果要接下一個需要先清理\n
- fgets(char*,總長度,數據源),定長讀取,遇到\n會讀入并停止。注意:此函數會讀入\n,一般場景并不好用,不過可以放心連用。
- gets(char*),效果同getline,但沒有string的自動擴容機制,也沒有cin.getline的強制限制截斷長度,所以不安全,不用