處理字符串的兩種方式:字符數組和string類庫
一、字符數組:
1、字符串的初始化:char str1[4] ={'q','w','e','r'};//字符數組,不是字符串
charstr2[5] = {'q','w','e','r','\0'};//用字符數組來存儲字符串
以上幾種方式都是正確的,在輸出上也沒有什麼區別,都可以直接用 cout<<srt1; 這種方式來打印數組。
但是如果這樣寫:
charst3[3] = {"qwe"};//用字符數組存儲字符串常量
是錯的,因爲"qwe"是字符串常量,系統會自動在後面加上'\0',必須留出一位用來存儲'\0'來表示字符串的結束;
利用cin初始化數組:
注意兩點:
編譯器會自動在最後加'\0',用戶輸入時編譯器通過空格和回車以及tab來確定一個字符串的結束。
測試:如果定義一個字符數組(足夠長),利用cin獲取值,再驗證字符串後面會不會自動加'\0'?
代碼:
#include<iostream>
using namespace std;
int main(int argc,char** argv) {
chara[10];// = {'q','w','e','r'};
cin>>a;
int b= (int)a[3];
cout<<b;
return0;
}
方法:先後輸入三個字符和四個字符。
結果:第一次輸出0('\0'的ASCII碼值),第二次輸出的是最後一位字符的ASCII碼值。即會自動加'\0'。
這裏有一個問題:如果定義數組長度爲3,但是在用戶輸入兩個以上字符時,vs會報錯,devcpp不會報錯。
如何解決想要錄入帶空格的字符串呢?
getline:
這是一個可以錄入一行字符的函數,遇到回車即停止,並且用'\0'替代輸入隊列的回車。
cin.getline(str:數組名,length:想要錄入的長度);
如果輸入長度大於length-1(編譯器需要一位來存儲'\0'),則多餘部分不錄入。
getline函數的返回值類型還是cin,所以getline函數可以連續調用,如:cin.getline(str1,10).getline(str2,20);
get:
與getline用法幾乎相同,唯一區別就是利用get不會替代掉輸入隊列的回車,而是將其保留下來,所以當再次調用時就會因爲第一個字符就是回車而讓這次沒有錄入字符。
二、string類:
字符數組的缺點:1、無法實現數組的動態定義(數組的大小必須在編譯時確定,就是說必須在編寫時就要確定數組的大小,用戶無法定義。)
2、不安全,容易讀取到數組接線以外
string類初始化字符串:
使用string類必須在頭文件中包含<string>
string str1;//初始化字符串長度爲0
string str2 = "hello";//定義時直接初始化
cin>>str1;//利用cin初始化字符串變量,字符串大小根據用戶輸入長度來定(解決了字符數組的弊端)
掌握最簡單的一個用法,“+”法,可以對字符串進行拼接。更多用法移步:cpp——string常用函數用法總結#include <iostream>
using namespace std;
int main(int argc, char** argv) {
string str1;
string str2 = "hello!";
cout<<"請輸入一個名字:\n";
cin>>str1;
cout<<str1 +" " + str2 ;
}