10min快速回顾C++语法(五)字符串专题
C++的語法基礎(五)
?寫在前面的話:本系列文章旨在短時間內回顧C/C++語法中的重點與易錯點,鞏固算法競賽與寫題過程中常用的語法知識,精準地解決學過但有遺忘的情況,為算法刷題打下堅實的基礎。
本文目錄
- C++的語法基礎(五)
- 8.1 字符與整數——ASCII碼
- 8.2 字符數組
- 8.2.1 字符數組的輸入輸出:
- 8.2.2 字符數組的常用操作
- 8.2.3 遍歷字符數組中的字符
- 字符數組的兩種遍歷方法
- 8.3 標準庫類型string
- 8.3.1 定義和初始化
- 8.3.2 string上的操作
- (1) string的讀寫
- (2) 使用getline讀取一整行
- (3) string的empty和size操作
- (4) string的比較:
- (5) 為string對象賦值:
- (6) 兩個string對象相加
- 8.3.3 處理string對象中的字符
- string的常見遍歷
- c++的范圍遍歷
8.1 字符與整數——ASCII碼
每個常用字符都對應一個-128 ~ 127的數字,二者之間可以相互轉化。
- 常用ASCII值:‘A’- 'Z’是65 ~ 90,‘a’ - 'z’是97 - 122,0 - 9是 48 - 57。
- 字符可以參與運算,運算時會將其當做整數:
練習:輸入一行字符,統計出其中數字字符的個數,以及字母字符的個數。
#include<bits/stdc++.h> using namespace std; int main() {char c;int nums = 0,chars = 0;while(cin >> n){if(c >= '0' && c <='9')nums++;else if( c >= 'A' && c <='Z' || c >= 'a' && c <= 'z')chars++;}printf("nums:%d \n chars:%d",nums,chars);return 0; }8.2 字符數組
**字符串就是字符數組加上結束符’\0’。**注意\0的ASCII碼值就是0。
可以使用字符串來初始化字符數組,但此時要注意,每個字符串結尾會暗含一個’\0’字符,因此字符數組的長度至少要比字符串的長度多 1 !
注意:在C++和java中,’ '和“ ”意義不同,一個是針對字符,一個是針對字符串。
#include <iostream>using namespace std;int main() {char a1[] = {'C', '+', '+'}; // 列表初始化,沒有空字符,不能稱作字符串char a2[] = {'C', '+', '+', '\0'}; // 列表初始化,含有顯示的空字符char a3[] = "C++"; // 自動添加表示字符串結尾的空字符char a4[6] = "Daniel"; // 錯誤:沒有空間可以存放空字符return 0;}8.2.1 字符數組的輸入輸出:
一般如果讀入的沒空格的話,采用cin或scanf讀入。如果需要讀入有空格的字符串,需要使用getline、cin.getline、fgets讀入。
#include <iostream>using namespace std;int main() {char str[100];cin >> str; // 輸入字符串時,遇到空格或者回車就會停止cout << str << endl; // 輸出字符串時,遇到空格或者回車不會停止,遇到'\0'時停止//cout<<str + 1 <<endl; 可以通過修改指針的方式控制從哪個地方起讀入/輸出。printf("%s\n", str);return 0;}讀入一行字符串,包括空格:
fgets:讀入到字符數組中
getline:讀入到字符串中,也可以用cin.getline的方式讀到字符串中
string只能用cin讀,scanf讀不了。
在題目沒超時的情況下,string比較好;輸入量不大的情況下,字符數組比較好。
#include <iostream>using namespace std;int main() {char str[100];//讀入到哪,最多讀入多少字符,從哪個文件讀入(通常stdin,定義好的)fgets(str, 100, stdin); // gets函數在新版C++中被移除了,因為不安全。// 可以用fgets代替,但注意fgets不會刪除行末的回車字符cin.getline(s,100);string s;getline(cin , s)cout << str << endl;return 0;}輸出也可以用puts(s) (等價于printf(“%s\n”,s)),包括換行符。
8.2.2 字符數組的常用操作
下面幾個函數需要引入頭文件:
#include <string.h>//或者 常用的***.h一般可以用c****替代。
- strlen(str),求字符串的長度(這個函數求長度是不包含’\0’字符的)
- strcmp(a, b),比較兩個字符串的大小,a < b返回-1,a == b返回0,a > b返回1。這里的比較方式是字典序!
- strcpy(a, b),將字符串b復制給從a開始的字符數組。
8.2.3 遍歷字符數組中的字符
字符數組的兩種遍歷方法
#include <iostream> #include <string.h>using namespace std;int main() {char a[100] = "hello world!";// 注意:下述for循環每次均會執行strlen(a),運行效率較低,最好將strlen(a)用一個變量存下來for (int i = 0; i < strlen(a); i ++ )//這實際上是兩個嵌套循環//for(int i = 0,len = strlen(a); i < len; i++)這樣將兩個循環分開,時間復雜度降低//也可以將遍歷改為如下:其中空格或者換行ASCII碼不是0,因此可以遍歷含有空格的部分。//for(int i = 0; a[i]; i++)cout << a[i] << endl;return 0;}練習:給定一個只包含小寫字母的字符串,請你找到第一個僅出現一次的字符。如果沒有,輸出no。(練習772)
練習:把一個字符串中特定的字符全部用給定的字符替換,得到一個新的字符串。
8.3 標準庫類型string
可變長的字符序列,比字符數組更加好用。需要引入頭文件:
#include <string>8.3.1 定義和初始化
#include <iostream> #include <string>using namespace std;int main() {string s1; // 默認初始化,s1是一個空字符串string s2 = s1; // s2是s1的副本,注意s2只是與s1的值相同,并不指向同一段地址string s3 = "hiya"; // s3是該字符串字面值的副本string s4(10, 'c'); // s4的內容是 "cccccccccc"return 0;}8.3.2 string上的操作
(1) string的讀寫
string不能用scanf讀入,僅能用cin讀入。但是可以用printf輸出。
#include <iostream> #include <string>using namespace std;int main() {string s1, s2;cin >> s1 >> s2;cout << s1 << s2 << endl;//可以用printf("%s\n",s1.c_str());return 0;}注意:不能用printf直接輸出string,需要寫成:printf(“%s”, s.c_str());
(2) 使用getline讀取一整行
#include <iostream> #include <string>using namespace std;int main() {string s;getline(cin, s);cout << s << endl;return 0;}(3) string的empty和size操作
(注意size是無符號整數,因此 s.size() <= -1一定成立):
s.length與s.size等價。
#include <iostream> #include <string>using namespace std;int main() {string s1, s2 = "abc";cout << s1.empty() << endl;cout << s2.empty() << endl;cout << s2.size() << endl;return 0;}(4) string的比較:
支持 >, <, >=, <=, ==, !=等所有比較操作,按字典序進行比較。
(5) 為string對象賦值:
string s1(10, 'c'), s2; // s1的內容是 cccccccccc;s2是一個空字符串 s1 = s2; // 賦值:用s2的副本替換s1的副本// 此時s1和s2都是空字符串(6) 兩個string對象相加
string s1 = "hello, "", s2 = "world\n"; string s3 = s1 + s2; // s3的內容是 hello, world\n s1 += s2; // s1 = s1 + s2(7) 字面值和string對象相加:
做加法運算時,字面值和字符都會被轉化成string對象,因此直接相加就是將這些字面值串聯起來:
string s1 = "hello", s2 = "world"; // 在s1和s2中都沒有標點符號 string s3 = s1 + ", " + s2 + '\n';當把string對象和字符字面值及字符串字面值混在一條語句中使用時,必須確保每個加法運算符的兩側的運算對象至少有一個是string:
string s4 = s1 + ", "; // 正確:把一個string對象和有一個字面值相加 string s5 = "hello" + ", "; // 錯誤:兩個運算對象都不是stringstring s6 = s1 + ", " + "world"; // 正確,每個加法運算都有一個運算符是string string s7 = "hello" + ", " + s2; // 錯誤:不能把字面值直接相加,運算是從左到右進行的8.3.3 處理string對象中的字符
可以將string對象當成字符數組來處理:
string的常見遍歷
#include <iostream> #include <string>using namespace std;int main() {string s = "hello world";for (int i = 0; i < s.size(); i ++ )cout << s[i] << endl;return 0;}或者使用基于范圍的for語句:
c++的范圍遍歷
#include <iostream> #include <string>using namespace std;int main() {string s = "hello world";//字符類型 遍歷變量 : 字符串for (char c: s) cout << c << endl;//c++的范圍遍歷for (char& c: s) c = 'a';/*如果直接for (char c: s) c = 'a';則不會改變s,因為它僅僅將創建的新字符c賦值為a,不會改變原變量。如果需要改變原變量的話,可以采用&取地址*/cout << s << endl;return 0;}練習:密碼翻譯,輸入一個只包含小寫字母的字符串,將其中的每個字母替換成它的后繼字母,如果原字母是’z’,則替換成’a’。
練習:輸入兩個字符串,驗證其中一個串是否為另一個串的子串。
總結
以上是生活随笔為你收集整理的10min快速回顾C++语法(五)字符串专题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于这些年做的 图片上传下载做的处理总结
- 下一篇: 我的十年青春(10至20):写博10年1