在寫C/C++時,字符/字符串的I/O一直是一件讓我非常頭疼的事情。
提前聲明:C字符串為char[]或char *類型,#include <string.h>
而C++字符串為string類型。#include <string>
遇到的問題:
1.初始化問題
定義C字符串時,有如下問題
char str[] = "hello world";//必須初始化 char str[3];//想要不初始化,必須指定長度 char* str;//沒有分配內存,且無法用字符串常量初始化,否則報錯: //"const char *" 類型的值不能用於初始化 "char *" 類型的實體
C++字符串不存在這種問題。
2.字符串長度未知。
對C字符串來說,長度未知所以無法指定長度,需要用戶輸入因此也不可能初始化。
解決方法只有兩種:1.指定足夠大的長度;2.動態分配內存。
對C++字符串來說,string類型本身就不需要指定長度,隨時可以賦值初始化,不存在這種問題。
3.字符串中存在空白字符,比如空格等。
C字符串處理這種情況比較簡單,單個字符依次讀入,或者整個字符串讀入均可。但是如果問題2,3同時出現就相當麻煩了。
單個字符依次讀入可參考getchar()和cin.get()。
整個字符串讀入可參考gets_s()和cin.getline()以及scanf()利用正則表達式格式化讀入。//gets()已被新標准廢除。
參數必須是已分配內存的字符數組。
C++字符串讀入通常用cin,但是會遇到空白字符提前結束。
因此建議使用getline(cin,str,'\n') //第三個參數默認是‘\n',可以不寫;第一個參數也可以是文件流
注意這里的getline()和上面的cin.getline()參數是不同的,不要混淆。
