字符串詳解+代碼分析

目錄

?

1. 字符與整數的聯系——ASCII碼每個常用字符都對應一個-128 ~ 127的數字,二者之間可以相互轉化。注意:目前負數沒有與之對應的字符。

2.字符數組

2.2 字符數組的常用操作下面幾個函數需要引入頭文件:

2.3 遍歷字符數組中的字符:

3. 標準庫類型string可變長的字符序列,比字符數組更加好用。需要引入頭文件:

3.1 定義和初始化

3.2 string上的操作

(2) 使用getline讀取一整行

(3) string的empty和size操作(注意size是無符號整數,因此 s.size() <= -1一定成立):

(4) string的比較:

(5) 為string對象賦值:

(6) 兩個string對象相加:

(7) 字面值和string對象相加:

3.3 處理string對象中的字符可以將string對象當成字符數組來處理:

4.string中元素的訪問

1、[ ]+下標?因為string類對[ ]運算符進行了重載,所以我們可以直接使用[ ]+下標訪問對象中的元素。并且該重載使用的是引用返回,所以我們可以通過[ ]+下標修改對應位置的元素。

2、使用at訪問對象中的元素?因為at函數也是使用的引用返回,所以我們也可以通過at函數修改對應位置的元素。

3、使用范圍for訪問對象中的元素

5.string中子字符串的提取

1、使用substr函數提取string中的子字符串


?

1. 字符與整數的聯系——ASCII碼
每個常用字符都對應一個-128 ~ 127的數字,二者之間可以相互轉化。注意:目前負數沒有與之對應的字符。

#include <iostream>using namespace std;int main()
{char c = 'a';cout << (int)c << endl;int a = 66;cout << (char)a << endl;return 0;
}

常用ASCII值:'A'- 'Z'是65 ~ 90,'a' - 'z'是97 - 122,0 - 9是 48 - 57。
字符可以參與運算,運算時會將其當做整數:

#include <iostream>using namespace std;int main()
{int a = 'B' - 'A';int b = 'A' * 'B';char c = 'A' + 2;cout << a << endl;cout << b << endl;cout << c << endl;return 0;
}

2.字符數組

字符串就是字符數組加上結束符'\0'。

可以使用字符串來初始化字符數組,但此時要注意,每個字符串結尾會暗含一個'\0'字符,因此字符數組的長度至少要比字符串的長度多 1 !

?

#include <iostream>using namespace std;int main()
{char str[100];cin >> str;             // 輸入字符串時,遇到空格或者回車就會停止cout << str << endl;    // 輸出字符串時,遇到空格或者回車不會停止,遇到'\0'時停止printf("%s\n", str);return 0;
}

讀入一行字符串,包括空格:

#include <iostream>using namespace std;int main()
{char str[100];fgets(str, 100, stdin);  // gets函數在新版C++中被移除了,因為不安全。// 可以用fgets代替,但注意fgets不會刪除行末的回車字符cout << str << endl;return 0;
}

2.2 字符數組的常用操作
下面幾個函數需要引入頭文件:

#include <string.h>
(1) strlen(str),求字符串的長度
(2) strcmp(a, b),比較兩個字符串的大小,a < b返回-1,a == b返回0,a > b返回1。這里的比較方式是字典序!
(3) strcpy(a, b),將字符串b復制給從a開始的字符數組。

#include <iostream>
#include <string.h>using namespace std;int main()
{char a[100] = "hello world!", b[100];cout << strlen(a) << endl;strcpy(b, a);cout << strcmp(a, b) << endl;return 0;
}

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 ++ )cout << a[i] << endl;return 0;
}

3. 標準庫類型string
可變長的字符序列,比字符數組更加好用。需要引入頭文件:

#include <string>

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;
}

3.2 string上的操作

(1) string的讀寫:

#include <iostream>
#include <string>using namespace std;int main()
{string s1, s2;cin >> s1 >> s2;cout << s1 << s2 << endl;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一定成立):

#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對象,因此直接相加就是將這些字面值串聯起來:string s1 = "hello", s2 = "world";      // 在s1和s2中都沒有標點符號
string s3 = s1 + ", " + s2 + '\n';

(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;  // 錯誤:不能把字面值直接相加,運算是從左到右進行的

3.3 處理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語句:

#include <iostream>
#include <string>using namespace std;int main()
{string s = "hello world";for (char c: s) cout << c << endl;for (char& c: s) c = 'a';cout << s << endl;return 0;
}

4.string中元素的訪問

1、[ ]+下標
?因為string類對[ ]運算符進行了重載,所以我們可以直接使用[ ]+下標訪問對象中的元素。并且該重載使用的是引用返回,所以我們可以通過[ ]+下標修改對應位置的元素。

#include <iostream>
#include <string>
using namespace std;
int main()
{string s("CSDN");//[]+下標訪問對象元素for (size_t i = 0; i < s.size(); i++){cout << s[i];}cout << endl;//[]+下標修改對象元素內容for (size_t i = 0; i < s.size(); i++){s[i] = 'x';}cout << s << endl; //xxxxreturn 0;
}

2、使用at訪問對象中的元素
?因為at函數也是使用的引用返回,所以我們也可以通過at函數修改對應位置的元素。

#include <iostream>
#include <string>
using namespace std;
int main()
{string s("CSDN");for (size_t i = 0; i < s.size(); i++){//at(pos)訪問pos位置的元素cout << s.at(i);}cout << endl;for (size_t i = 0; i < s.size(); i++){//at(pos)訪問pos位置的元素,并對其進行修改s.at(i) = 'x';}cout << s << endl; //xxxxreturn 0;
}

3、使用范圍for訪問對象中的元素

需要特別注意的是:若是需要通過范圍for修改對象的元素,則用于接收元素的變量e的類型必須是引用類型,否則e只是對象元素的拷貝,對e的修改不會影響到對象的元素。

#include <iostream>
#include <string>
using namespace std;
int main()
{string s("CSDN");//使用范圍for訪問對象元素for (auto e : s){cout << e;}cout << endl; //CSDN//使用范圍for訪問對象元素,并對其進行修改for (auto& e : s) //需要修改對象的元素,e必須是引用類型{e = 'x';}cout << s << endl; //xxxxreturn 0;
}

5.string中子字符串的提取

1、使用substr函數提取string中的子字符串

#include <iostream>
#include <string>
using namespace std;
int main()
{string s1("abcdef");string s2;//substr(pos, n)提取pos位置開始的n個字符序列作為返回值s2 = s1.substr(2, 4);cout << s2 << endl; //cdefreturn 0;
}
#include <iostream>
#include <string>
using namespace std;
int main()
{string s("abcdef");char str[20];//copy(str, n, pos)復制pos位置開始的n個字符到str字符串size_t length = s.copy(str, 4, 2);//copy函數不會在復制內容的末尾附加'\0',需要手動加str[length] = '\0';cout << str << endl; //cdefreturn 0;
}

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212016.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212016.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212016.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ICMP協議以及報文講解(ICMP查詢報文、ICMP差錯報文)

目錄 ICMP協議 ICMP報文格式 ICMP回顯請求/應答報文 ICMP差錯報文 ICMP 宿主機不可達差錯報文 ICMP 重定向差錯報文 ICMP TTL超時差錯報文 ICMP協議 ICMP協議的作用 ICMP&#xff08;Internet Control massage protocol&#xff09;因特網控制協議&#xff0c;主要用來…

C語言再學習 -- 單精度(float)和雙精度(double)浮點數 與 十六進制(HEX) 之間轉換(轉載))

之前講過浮點數部分&#xff0c;參看&#xff1a;C語言再學習 – 浮點數 現在程序中要將浮點數&#xff0c;通過TCP發送。那得先將其轉換為十六進制才行呀。 那么問題就來了。 參看&#xff1a;C語言&#xff1a;單精度(float)和雙精度(double)浮點數 與 十六進制(HEX) 之間…

(JAVA)-打印流

打印流是高級流&#xff0c;只能寫不能讀&#xff0c;只有輸出流 只操作文件目的地&#xff0c;不操作數據源 能實現數據的原樣輸出 printStream:字節打印流 構造方法&#xff1a; 用文件或地址的方式創建字節打印流也會創建一個字節基本流。 字節流底層沒有緩存區&#xff…

文檔或書籍掃描為 PDF:ScanPapyrus Crack

ScanPapyrus 可讓您快速輕松地將文檔或書籍掃描為 PDF&#xff0c;批處理模式使掃描過程快速高效&#xff0c;自動處理書籍并將其拆分為單獨的頁面 用于快速掃描文檔、書籍或打印照片的掃描儀軟件 快速掃描文檔 使用此掃描儀軟件&#xff0c;您無需在掃描儀和計算機之間來回移動…

SpringBoot 官方腳手架不再支持Java8和Java11

Spring 官方腳手架不再支持初始化 Java8 和 Java 11 項目&#xff0c;目前僅支持初始化Java17 和 Java21 項目。 阿里巴巴Spring腳手架支持初始化Java8、Java11、Java17、Java19 的項目&#xff0c;不支持初始化Java21的項目。

Torn Lucky Ticket

題目 #include<bits/stdc.h> using namespace std; #define int long long const int maxn 1e6 5, d 500; vector<string> vec[6]; int mp[1005]; signed main(){int n;cin >> n;for(int i 1; i < n; i){string s;cin >> s;int len s.size();…

java簡述springboot內置數據庫 并舉例啟動h2內存數據環境

在前面 我們講了 springboot 給我們提供了 默認的 數據源 默認 HikariCP 以及其他兩種內置數據源 持久化技術 JdbcTemplate 那么 說起來很多人難以置信 不過 springboot 也真的給我們內置了數據庫技術 而且不止一種 是三種 這三個數據庫的特點在于 它們都是用java語言寫的 就表…

28 動態規劃解按摩師的最長預約時間

問題描述&#xff1a;一名有名的按摩師會受到源源不斷的預約請求&#xff0c;每個預約都可以選擇接或者不接&#xff0c;在每次預約服務之間要有休息時間&#xff0c;因此不能接相鄰的預約&#xff0c;給定一個請求序列&#xff0c;按摩師找到最優的預約集合(總預約時間最長)&a…

探索中文文本處理利器 - Python jieba庫詳解

更多資料獲取 &#x1f4da; 個人網站&#xff1a;ipengtao.com jieba庫介紹 在處理中文文本數據時&#xff0c;分詞是一項至關重要的任務。而在Python的工具箱中&#xff0c;jieba庫作為一款強大的中文分詞工具&#xff0c;為開發者提供了高效而靈活的解決方案。jieba&#…

JDK8新特性:Lambda表達式規則及用法,方法引用

目錄 Lambda表達式是JDK8新增的一種語法格式 1.作用 2.用法規則&#xff1a; 3.方法引用 Lambda表達式是JDK8新增的一種語法格式 1.作用 簡化匿名內部類的代碼寫法 Lambad用法前提&#xff1a;只能簡化函數式接口&#xff08;一般加有Funcationallnterface&#xff09;&a…

Python dateutil 庫:簡化日期和時間處理的利器

更多資料獲取 &#x1f4da; 個人網站&#xff1a;ipengtao.com 在Python中&#xff0c;處理日期和時間是常見的任務之一。dateutil庫是Python標準庫中datetime模塊的擴展&#xff0c;提供了許多方便的工具和函數&#xff0c;簡化了日期和時間的操作。 安裝與基本用法 首先&…

小黑子之——MybatiPlus整合

MybatiPlus學習 一、MybatiPlus簡介1.1 入門案例1.2 mybatisPlus概述1.3 總結 二、標準數據層開發2.1 標準的CRUD使用2.2 新增2.3 刪除2.4 修改2.5 根據Id查詢2.6 查詢全部2.7 Lombok2.8 分頁功能 三、DQL控制3.1 條件查詢方式3.1.1 構建條件查詢3.1.2 多條件查詢3.1.3 null值判…

運維05:自動化

人工運維時代 運維人員早期需要維護眾多的機器&#xff0c;因此需要執行很多重復的勞動&#xff0c;很多機器需要同時部署相同的服務或者是執行相同的命令&#xff0c;還得反復地登錄不同的機器&#xff0c;執行重復的動作 自動化運維時代 早期運維人員會結合ssh免密登錄&…

Java基礎——對象類型轉換(向上、向下轉型)

非繼承關系的類之間對象類型不可以互相類型轉換&#xff0c;只有繼承關系才可以互相轉換。 簡單說&#xff0c;對象類型轉換的前提要是繼承關系。 對象類型轉換分為&#xff1a;向上轉型和向下轉型。多態就是一種自動向上轉型。 向上轉型&#xff1a;子類對象用父類類型接收…

Leetcode 2963. Count the Number of Good Partitions

Leetcode 2963. Count the Number of Good Partitions 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;2963. Count the Number of Good Partitions 1. 解題思路 這一題根據題意&#xff0c;顯然我們可以將其先分為 n n n個原子partition&#xff0c;確保任意兩個partition之間…

git 常用的使用方法

1.查看分支 $ git branch #查看本地分支 $ git branch -r #查看遠程分支 $ git branch -a #查看所有分支 $ git branch -vv #查看本地分支及追蹤的分支 2.創建分支 方法1 $ git branch 分支名 #創建本地分支 #將本地分支push&#xff0c;就創建了遠程分支方法2 #創建本地分…

載入了名字空間‘htmltools’ 0.5.6,但需要的是>= 0.5.7解決方案

解決方案&#xff1a;刪除之前的舊版本安裝包&#xff0c;安裝新的包 1.卸載之前的安裝包 2.關閉R&#xff0c;重新打開 3. # install.packages("htmltools") library(htmltools)

Java 并發編程(一)

1、在 java 中守護線程和本地線程區別&#xff1f; java 中的線程分為兩種&#xff1a;守護線程&#xff08;Daemon&#xff09;和用戶線程&#xff08;User&#xff09; 任何線程都可以設置為守護線程和用戶線程&#xff0c;通過方法 Thread.setDaemon(boolon)&#xff1b;tru…

HarmonyOS學習--了解基本工程目錄

1.工程級目錄 工程的目錄結構如下&#xff1a; 其中詳細如下&#xff1a; AppScope中存放應用全局所需要的資源文件。entry是應用的主模塊&#xff0c;存放HarmonyOS應用的代碼、資源等。oh_modules是工程的依賴包&#xff0c;存放工程依賴的源文件。build-profile.json5是工…

如何找到MACOS系統更新的安裝包

首先在應用商店中下載新系統的安裝包&#xff0c;然后在設置中不要點安裝&#xff0c;會自動跳出安裝的界面&#xff0c;不要關閉界面&#xff0c;打開命令行用root權限輸入命令cat /var/log/install.log | grep *.dmg&#xff0c; 就會顯示 sh-3.2# cat /var/log/install.log …