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

異想之旅:本人博客完全手敲,絕對非搬運,全網不可能有重複;本人無團隊,僅為技術愛好者進行分享,所有內容不牽扯廣告。本人所有文章發佈平台為CSDN、博客園、簡書和開源中國,後期可能會有個人博客,除此之外全部是盜文!


一、char [] 類型

1. 定義與輸入

1.1 定義時指定內容

#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數組不賦值默認所有位置都是結束符 '\0' 。直接輸出字符數組時,從起始地址開始,找到第一個結束符結束輸出。

1.2 樸素cin

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

    return 0;
}

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

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

// 輸入3:123456
// 輸出3:123456
// 此時數組發生了溢出!

嚴格來講三個輸入輸出全部發生了數組溢出,因為前兩個輸入輸出中 '\0' 也處於 a[3] 的位置

1.3 cin.get()

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

    return 0;
}

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

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

如果在未達到最大長度限制時出現空格,則輸入從行開始讀取到第一個空格結束。

1.4 cin.getline()

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

    return 0;
}

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

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

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() 唯一的不同就是不限制最大字符數,需要自行確認輸入數據小於數組最大限制。越界有風險,偷懶需謹慎!

1.6 對於1.3~1.5的警告內容

注意: 對於先輸入數字再輸入字符串並使用 cin.get()cin.getline()gets() 方式時,程序會先讀取當前行剩餘部分(有可能只有一個回車符),而不會讀取新的一行。若數字和字符串在同一行,則中間的空格也將作為字符串的一部分。

具體請看樣例

程序 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相關頭文件,使用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 字符串複製

#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

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

設想一本英語字典里的單詞,何者在前何者在後? 顯然的做法是先按照第一個字母、以 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會以空格作為結束符
    strcat(a, b);
    cout << a;

    return 0;
}

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

對於 strcpy()strcat() 參數順序如果不好記的話,就想着前面的是被改變的,後面的是不變的

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中首次出現b的地址的指針。此處我們為了將地址轉換為a數組的索引所以再減去一下a的初始地址。

二、string類

1. 定義與輸入

1.1 定義時指定內容

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

    return 0;
}

// 輸出:123

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

與char數組不同,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數組不同的是,string類不會越界或溢出!

1.3 getline()

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

    return 0;
}

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

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

注意:若輸入數據一行數字一行字符串直接使用 getline() 會導致讀取不到數據,解決方案類似第一部分的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 字符串複製

#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

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

設想一本英語字典里的單詞,何者在前何者在後? 顯然的做法是先按照第一個字母、以 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風格……

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中首次出現b的索引

三、char [] 與 string 相互轉換

1. string 轉 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 [] 轉 string

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

四、char [] 與 string 轉換為數值類型(2021.8.28添加)

這個內容還煩請移步我的另一篇文章 C++中【字符串】與【整型】和【浮點型】轉換全攻略!_異想之旅的博客-CSDN博客


手寫5000字,你看到這裡難道還不準備給個三連嗎!</string.h>