異想之旅:本人博客完全手敲轧铁,絕對非搬運,全網(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()
從此處開始程序需要包含頭文件 string
或 string.h
或 cstring
#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)備給個三連嗎饱须!