C++字符串【string】和【char []】操作全攻略

異想之旅:本人博客完全手敲轧铁,絕對非搬運,全網(wǎng)不可能有重復(fù)药薯;本人無團隊童本,僅為技術(shù)愛好者進行分享脸候,所有內(nèi)容不牽扯廣告运沦。本人所有文章發(fā)布平臺為CSDN和簡書,后期可能會有個人博客嫁盲,除此之外全部是盜文烈掠!


一向叉、char [] 類型

1. 定義與輸入

1.1 定義時指定內(nèi)容

#include <iostream>
using namespace std;
int main() {
    char a[10] = "123";
    cout << a;

    return 0;
}

// 輸出:123

此時程序自動在 a[3] 的位置寫入了終止符 '\0'

#include <iostream>
using namespace std;
int main() {
    char a[10];
    a[0] = 'A';
    a[2] = 'C';
    cout << a;

    return 0;
}

// 輸出:A

char數(shù)組不賦值默認(rèn)所有位置都是結(jié)束符 '\0' 母谎。直接輸出字符數(shù)組時奇唤,從起始地址開始,找到第一個結(jié)束符結(jié)束輸出甲葬。

1.2 樸素cin

#include <iostream>
using namespace std;
int main() {
    char a[3];
    // 輸入到第一個空格截止懈贺;需要保證將要獲取的內(nèi)容不多于a的長度否則溢出
    cin >> a;
    cout << a;

    return 0;
}

// 輸入1:123
// 輸出1:123

// 輸入2:123 456
// 輸出2:123

// 輸入3:123456
// 輸出3:123456
// 此時數(shù)組發(fā)生了溢出梭灿!

嚴(yán)格來講三個輸入輸出全部發(fā)生了數(shù)組溢出堡妒,因為前兩個輸入輸出中 '\0' 也處于 a[3] 的位置

1.3 cin.get()

#include <iostream>
using namespace std;
int main() {
    char a[3];
    cin.get(a, sizeof(a));  // 第二個參數(shù)為a的長度
    cout << a;

    return 0;
}

// 輸入:12345
// 輸出:12

第6行 cin.get() 中的第二個參數(shù)限定了輸入的最大長度:最大長度實際為傳入的數(shù)字減一皮迟,因為a的最后一個位置需要存放 '\0'

如果在未達到最大長度限制時出現(xiàn)空格,則輸入從行開始讀取到第一個空格結(jié)束忿檩。

1.4 cin.getline()

#include <iostream>
using namespace std;
int main() {
    char a[5];
    cin.getline(a, sizeof(a));  // 第二個參數(shù)為a的長度
    cout << a;

    return 0;
}

// 輸入:1 2345
// 輸出:1 23

與上方 cin.get() 的用法和意義完全相同休溶,唯一區(qū)別是空格不會作為輸入結(jié)束的條件

1.5 gets()

從此處開始程序需要包含頭文件 stringstring.hcstring

#include <cstring>
#include <iostream>
using namespace std;
int main() {
    char a[5];
    gets(a);
    cout << a;

    return 0;
}
// 輸入:1 2 3
// 輸出:1 2 3

cin.getline() 唯一的不同就是不限制最大字符數(shù)兽掰,需要自行確認(rèn)輸入數(shù)據(jù)小于數(shù)組最大限制徒役。越界有風(fēng)險忧勿,偷懶需謹(jǐn)慎!

1.6 對于1.3~1.5的警告內(nèi)容

注意: 對于先輸入數(shù)字再輸入字符串并使用 cin.get()cin.getline()gets() 方式時熏挎,程序會先讀取當(dāng)前行剩余部分(有可能只有一個回車符)坎拐,而不會讀取新的一行。若數(shù)字和字符串在同一行都伪,則中間的空格也將作為字符串的一部分陨晶。

具體請看樣例

程序 1

#include <iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    char a[3];
    gets(a);
    cout << a;
    return 0;
}

輸入 1-1

10 abc
def

輸出 1-1(開頭有一個空格)

 abc

輸入 1-2

10
abcdef

輸出 1-2

(空)

解決方案如下

程序 2

#include <iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    char a[3];
    gets(a);
    gets(a);
    cout << a;
    return 0;
}

輸入 2-1

10 abc
def

輸出 2-1(開頭有一個空格)

def

輸入 2-1

10
abcdef

輸出 2-1

abcdef

2. 基本操作

這部分所有代碼都需要string相關(guān)頭文件先誉,使用1.2介紹的樸素cin方式輸入

2.1 獲取長度

#include <cstring>
#include <iostream>
using namespace std;
int main() {
    char a[5];
    cin >> a;
    cout << strlen(a);

    return 0;
}

// 輸入:123
// 輸出:3

2.2 字符串復(fù)制

#include <cstring>
#include <iostream>
using namespace std;
int main() {
    char a[5], b[5];
    cin >> a;
    strcpy(b, a);
    cout << b;

    return 0;
}

// 輸入:12345
// 輸出:12345

2.3 字符串比較

#include <cstring>
#include <iostream>
using namespace std;
int main() {
    char a[5], b[5];
    cin >> a >> b;
    cout << bool(a > b);

    return 0;
}

// 輸入:ef abcd
// 輸出:1

比較的是字典序谆膳,字典序的解釋如下:

設(shè)想一本英語字典里的單詞漱病,何者在前何者在后把曼? 顯然的做法是先按照第一個字母嗤军、以 a、b老客、c……z 的順序排列震叮;如果第一個字母一樣苇瓣,那么比較第二個击罪、第三個乃至后面的字母。如果比到最后兩個單詞不一樣長(比如眠副,sigh 和 sight),那么把短者排在前竣稽。

2.4 字符串連接

#include <cstring>
#include <iostream>
using namespace std;
int main() {
    char a[20], b[6];
    cin >> a >> b;  // 別忘了樸素cin會以空格作為結(jié)束符
    strcat(a, b);
    cout << a;

    return 0;
}

// 輸入:Hello World
// 輸出:HelloWorld

對于 strcpy()strcat() 參數(shù)順序如果不好記的話囱怕,就想著前面的是被改變的槽唾,后面的是不變的

2.5 字符串搜索

#include <cstring>
#include <iostream>
using namespace std;
int main() {
    char a[20], b[6];
    cin >> a >> b;
    cout << strstr(a, b) - a;

    return 0;
}

// 輸入:ababcab abc
// 輸出:2

strstr(a, b) 返回的是一個指向a中首次出現(xiàn)b的地址的指針。此處我們?yōu)榱藢⒌刂忿D(zhuǎn)換為a數(shù)組的索引所以再減去一下a的初始地址光涂。

二、string類

1. 定義與輸入

1.1 定義時指定內(nèi)容

#include <iostream>
using namespace std;
int main() {
    string a = "123";
    cout << a;

    return 0;
}

// 輸出:123

此時程序自動在 a[3] 的位置寫入了終止符 '\0'

與char數(shù)組不同拧烦,string類型不可以直接通過索引位置定義

#include <iostream>
using namespace std;
int main() {
    string a;
    a[0] = 'A';
    cout << a;

    return 0;
}

// 輸出:(空)

但是通過索引進行修改是合法的:

#include <iostream>
using namespace std;
int main() {
    string a = "ABC";
    a[0] = 'a';
    cout << a;

    return 0;
}

// 輸出:aBC

1.2 樸素cin

#include <iostream>
using namespace std;
int main() {
    string a;
    // 輸入到第一個空格截止
    cin >> a;
    cout << a;

    return 0;
}

// 輸入1:123
// 輸出1:123

// 輸入2:123 456
// 輸出2:123

// 輸入3:123456
// 輸出3:123456

輸入同樣是從開始到第一個空格忘闻,但是與char數(shù)組不同的是,string類不會越界或溢出恋博!

1.3 getline()

#include <iostream>
using namespace std;
int main() {
    char a[3];
    cin.get(a, sizeof(a));  // 第二個參數(shù)為a的長度
    cout << a;

    return 0;
}

// 輸入:12345
// 輸出:12

cin.get()cin.getline()gets() 對string不適用

注意:若輸入數(shù)據(jù)一行數(shù)字一行字符串直接使用 getline() 會導(dǎo)致讀取不到數(shù)據(jù)债沮,解決方案類似第一部分的1.6

2. 基本操作

這部分所有代碼使用1.2介紹的樸素cin方式輸入

2.1 獲取長度

#include <iostream>
using namespace std;
int main() {
    string a;
    cin >> a;
    cout << a.length();
    // cout << a.size();  // 等價

    return 0;
}

// 輸入:123
// 輸出:3

2.2 字符串復(fù)制

#include <iostream>
using namespace std;
int main() {
    string a, b;
    cin >> a;
    b = a;
    cout << b;
    
    return 0;
}

// 輸入:12345
// 輸出:12345

真的不能再簡單了

2.3 字符串比較

#include <iostream>
using namespace std;
int main() {
    string a, b;
    cin >> a >> b;
    cout << bool(a > b);

    return 0;
}

// 輸入:ef abcd
// 輸出:1

比較的是字典序炼吴,字典序的解釋如下:

設(shè)想一本英語字典里的單詞,何者在前何者在后疫衩? 顯然的做法是先按照第一個字母硅蹦、以 a、b闷煤、c……z 的順序排列童芹;如果第一個字母一樣,那么比較第二個鲤拿、第三個乃至后面的字母假褪。如果比到最后兩個單詞不一樣長(比如,sigh 和 sight)近顷,那么把短者排在前生音。

2.4 字符串連接

#include <iostream>
using namespace std;
int main() {
    string a, b;
    cin >> a >> b;
    cout << a + b;

    return 0;
}

// 輸入:Hello World
// 輸出:HelloWorld

嗯,非常Python風(fēng)格……

2.5 字符串搜索

#include <iostream>
using namespace std;
int main() {
    string a, b;
    cin >> a >> b;
    cout << a.find(b);

    return 0;
}

// 輸入:ababcab abc
// 輸出:2

輸出是a中首次出現(xiàn)b的索引

三窒升、char [] 與 string 相互轉(zhuǎn)換

1. string 轉(zhuǎn) char []

#include <string.h>
#include <iostream>
using namespace std;
int main() {
    string s = "123.123";
    char a[101];
    strcpy(a, s.c_str());
    // strcpy(a, s.data());  // 與上方語句等價缀遍,任選其一即可
    cout << a << endl;

    return 0;
}

2. char [] 轉(zhuǎn) string

#include <bits/stdc++.h>
using namespace std;
int main() {
    char a[100] = "123.123";
    string s = a;
    cout << s;
    return 0;
}

手寫5000字,你看到這里難道還不準(zhǔn)備給個三連嗎饱须!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瑟由,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子冤寿,更是在濱河造成了極大的恐慌歹苦,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件督怜,死亡現(xiàn)場離奇詭異殴瘦,居然都是意外死亡,警方通過查閱死者的電腦和手機号杠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門蚪腋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丰歌,“玉大人,你說我怎么就攤上這事屉凯×⑻” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵悠砚,是天一觀的道長晓勇。 經(jīng)常有香客問我,道長灌旧,這世上最難降的妖魔是什么绑咱? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮枢泰,結(jié)果婚禮上描融,老公的妹妹穿的比我還像新娘。我一直安慰自己衡蚂,他們只是感情好窿克,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著毛甲,像睡著了一般让歼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丽啡,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天谋右,我揣著相機與錄音,去河邊找鬼补箍。 笑死改执,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坑雅。 我是一名探鬼主播辈挂,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼裹粤!你這毒婦竟也來了终蒂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤遥诉,失蹤者是張志新(化名)和其女友劉穎拇泣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矮锈,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡霉翔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了苞笨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片债朵。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡子眶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出序芦,到底是詐尸還是另有隱情臭杰,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布谚中,位于F島的核電站渴杆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏藏杖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一脉顿、第九天 我趴在偏房一處隱蔽的房頂上張望蝌麸。 院中可真熱鬧,春花似錦艾疟、人聲如沸来吩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弟疆。三九已至,卻和暖如春盗冷,著一層夾襖步出監(jiān)牢的瞬間怠苔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工仪糖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留柑司,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓锅劝,卻偏偏與公主長得像攒驰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子故爵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容