C++學習筆記之五(String類)

C++

  • 前言
    • getline
    • length, size
    • c_str
    • append, insert
    • erase
    • find
    • substr
    • isspace, isdigit

前言

C++是兼容C語言的,所以C++的字符串自然繼承C語言的一切字符串,但它也衍生出屬于自己的字符串類,即String類。String更像是一個容器,但它與容器還是有一些差別,我看網上很多人直接把它等同于一種容器,這種說法大概是有錯誤的。。。
string類的相關方法很多,下面我只記錄一下我個人常用到的一些方法,必然不詳實,僅供參考。
所有用到string類的地方都至少需要一個string的頭文件,如果還需要其它的,我們另外注明。

#include <string>

getline

從用戶端接收字符串方法其實挺多的,C語言中最常見的就是scanf函數了,類比這個函數,C++也可以用cin>>…的方式接收用戶輸入。但這兩者都只能接收一個單詞,或一個數字,因為它們會以空格符作為結尾。可以看看以下這個例子。

	string s;cout <<"please enter a string:  ";cin >> s;cout << s <<endl;

輸出結果如下:
在這里插入圖片描述
以空格為結尾的接收輸入函數顯然不是我們所希望的,一句話,難免有許多空格。那么這時候就需要用到getline函數了,這個函數讀取的字符串會以換行符”\n“為結尾。

	 string s1;cout <<"please enter a string:  ";getline(cin, s1);cout << s1 <<endl;

getline有兩個參數,第一個傳入參數是獲取字符串的地方,第二個傳入參數是字符串存放的地方。這里獲取用戶端輸入,所以第一個參數就是cin了。
程序運行結果如下:
在這里插入圖片描述

length, size

length是C++早期讀取字符串長度的唯一方法,但后面為了兼容容器類,又推出了size方法。兩者的作用是一模一樣的。調用該函數會返回字符串的字符數,而非字節數。
用法也十分簡單:

	string s1;cout <<"please enter a string:  ";getline(cin, s1);cout << s1.length() <<endl;

程序運行結果如下,注意空格也算一個字符。
在這里插入圖片描述

c_str

c_str方法的作用是把C++的字符串類轉化為常規的字符串,即變成可以用指針索引的字符串。因為有些函數要求傳入參數是" char * "。比如open函數。
看下面這個例程,c_str只能轉化為const char* 類型。并且由于字符指針指向的只能是一個字符,所以打印的時候需要用for循環打印出來。

	string path = "/home/object_file";const char *f;f = path.c_str();			for(int i=0; i<path.length(); i++){cout<< f[i];}cout<<"\n";

不過如果用C語言的printf函數,倒可以免去使用for循環,直接用%s告訴計算機這是一個字符串即可。

	string path = "/home/object_file";const char *f;f = path.c_str();printf("%s \n", f);

有string類轉化為const char*,那放過來char *轉化為string類也可以。操作十分簡單,只需要直接賦值就行。

    char temp[15] = "hello world";string s = temp;cout << s << endl; 

append, insert

append方法和insert方法都是在原來的字符串的基礎上添加某些東西,但前者是添加在字符串后面,后者則可以添加到指定位置。它們的用法都比較簡單,直接看以下例子。

	string s1 = "hello ";string s2 = "word";s1.append("wrold");s2.insert(0, "add a ");			//第一個參數是插入的位置,第二個參數是插入的字符串cout <<"s1: "<< s1 << endl; cout <<"s2: "<< s2 << endl; 

以上程序的運行情況如下:

s1: hello world
s2: add a word

erase

erase方法用來擦除字符串中的某些字符,在處理數據的時候還挺有用的。
直接看一個例子:

    string s = "hello world!";s.erase(3, 2);cout << s << endl;

程序運行結果如下:
在這里插入圖片描述
可見,erase第一個傳入參數是起始位置,第二個傳入參數擦除的字符個數。如果沒有添加第二個參數則視為,在擦除起始位置之后的全部字符。可以看個例子:

    string s = "hello world!";s.erase(3);cout << s << endl;				//打印結果是hel

熟悉C++容器的朋友大概會發現,這與容器的erase方法有一些不一樣。以vector為例,erase(begin, end)的第一個參數是要擦除的起始位置,第二個位置是要擦除的結束位置,如果第二個參數不寫,就默認只擦除一個成員。

find

find方法是從字符串中查找某個特定的字符,并且返回該字符第一次出現時的位置。當然find方法也有很多衍生方法,比如find_first_of, find_last_of等等。而對于這些衍生方法,大家有興趣可以自行查閱相關資料。我這里就只說一下find的一些常規應用。

    string s = "hello world!";int loc = s.find("o");cout << loc << endl;

在"hello world!"這個字符串中,"o"第一個出現的位置是4,所以打印結果就是4。
而如果我們像知道"o"第二次出現的地方呢?可以參考以下這個例程:

    string s = "hello world!";int loc = s.find("o");int cnt = 1;while(loc != string::npos){if(cnt == 2)    break;loc = s.find("o", loc+1);cnt ++;}cout << loc <<endl;

程序輸出結果如下:
在這里插入圖片描述
在"hello world!"這個字符中,"o"第二次出現的位置確實是7,符合預期。
那么總結一下,find有兩個傳入參數,第一個傳入參數是期望查找的字符,第一個傳入參數是字符串中搜索區域的起始位置,如果沒有這個參數,則默認從頭開始搜索。
find方法的返回值就是被搜索字符首次出現的位置,如果沒有找到該字符,則返回string::npos。

substr

substr方法用于截取字符串中的某一段,它有兩個參數,第一個參數是截取區間的起點,第二個參數是截取區間的終點。返回值是所截取出來的字符串。
以下例程的作用是將"hello world!"中的hello截取出來:

    string s = "hello world!";string sp = s.substr(0, 5);cout << sp << endl;

isspace, isdigit

isspace和isdigit分別是判斷字符串中的空格和數字的函數,調用這兩個函數的時候需要添加頭文件cctype。其實這兩個函數不是C++string類特有的,C語言中的字符串也可以用。

#include <cctype>

看個例子吧,該例子欲將"hello world!"中的空格抹去。

    string s = "hello world!";for(int i=0; i<s.length(); i++){if(isspace(s[i])){s.erase(i, 1);i--;}}cout << s <<endl;

isspace的返回值是一個int類型,如果檢查到空格就返回一個非零數據,否則返回0.
突然想到另一種消除空格方法,也一并寫出來吧。

    string s = "hello world!";int cnt = 0;for(char i : s){if(i == ' '){s.erase(cnt, 1);cnt--;}cnt ++;}cout << s <<endl;

接下來再來看看isdigit的用法,isdigit和isspace的返回值很像,都是檢查到目標則返回非零數字,否則返回0.
在本例程中,我欲將字符串"hello 123 world!"的數字打印出來。

    string s = "hello 123 world!";for(int i=0; i<s.length(); i++){if(isdigit(s[i])){int temp = s[i] - '0';cout<< temp;}}cout <<"\n";

輸出結果如下:
在這里插入圖片描述

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

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

相關文章

C++入門【6-C++ 修飾符類型】

C 修飾符類型 C 允許在 char、int 和 double 數據類型前放置修飾符。 修飾符是用于改變變量類型的行為的關鍵字&#xff0c;它更能滿足各種情境的需求。 下面列出了數據類型修飾符&#xff1a; signed&#xff1a;表示變量可以存儲負數。對于整型變量來說&#xff0c;signe…

12月11日作業

完善對話框&#xff0c;點擊登錄對話框&#xff0c;如果賬號和密碼匹配&#xff0c;則彈出信息對話框&#xff0c;給出提示登錄成功&#xff0c;提供一個Ok按鈕&#xff0c;用戶點擊Ok后&#xff0c;關閉登錄界面&#xff0c;跳轉到其他界面 如果賬號和密碼不匹配&#xff0c;彈…

被迫搬家,寬帶遷移怎么辦?

廣州一棟違建爛尾樓&#xff0c;13年里從未停止出租&#xff0c;年年住滿人。這棟樓沒有貼外墻&#xff0c;裸露的水泥表面都被雨水腐蝕&#xff0c;很多陽臺沒有建好&#xff0c;只是簡單加裝了護欄&#xff0c;存在巨大安全隱患。 為什么爛尾樓年年滿人呢&#xff1f; 因為它…

算法:快速冪ksm

為什么使用快速冪&#xff1a; 假設題目要求求a的b次方。 c/c里并沒有^運算符&#xff0c;所以我們第一時間可能想到使用for循環&#xff0c;將“a * a”語句循環b次。但是這樣時間復雜度為O(n),所以當b過大的時候&#xff0c;我們的程序將會非常慢&#xff0c;所以我們需要使用…

基于ssm樂購游戲商城系統論文

摘 要 隨著社會的發展&#xff0c;游戲品種越來越多&#xff0c;計算機的優勢和普及使得樂購游戲商城系統的開發成為必需。樂購游戲商城系統主要是借助計算機&#xff0c;通過對信息進行管理。減少管理員的工作&#xff0c;同時也方便廣大用戶對個人所需信息的及時查詢以及管理…

基于深度學習的yolov5入侵檢測系統

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介IntroductionYOLOv5 Overview入侵檢測系統架構1. 數據采集2. YOLOv5模型訓練3. 實時監測4. 告警與反饋 性能評估與優化 二、功能三、系統四. 總結 一項目簡…

Huawei Auth-HTTP Server 1.0 存在任意文件讀取漏洞 附POC軟件

@[toc] Huawei Auth-HTTP Server 1.0 存在任意文件讀取漏洞 附POC 免責聲明:請勿利用文章內的相關技術從事非法測試,由于傳播、利用此文所提供的信息或者工具而造成的任何直接或者間接的后果及損失,均由使用者本人負責,所產生的一切不良后果與文章作者無關。該文章僅供學…

【精華帖】發布你造的輪子 -- 創建Nuget包(分布操作)

目錄 1、您的項目 2、創建 .nuspec 文件 3、一張圖片勝過一千個拉取請求 4、包括自述文件 MD 文件 5、構建軟件包 6、將包部署到 Nuget.Org

視頻中自監督學習:「我的世界」下指令理解與跟隨

本文介紹了北京大學人工智能研究院梁一韜助理教授所帶領的 CraftJarvis 團隊在「我的世界」環境下探索通用智能體設計的新進展&#xff0c;題為“GROOT: Learning to Follow Instructions by Watching Gameplay Videos”。 ? GROOT 該研究的核心目標是探索能否擺脫文本數據的標…

【NR技術】NR NG-RAN整體架構 -網絡接口以及無線協議框架(四)

1 引言 本博文介紹NR NG-RAN的網絡節點間的接口以及無線協議框架。網絡接口介紹包括RAN和NGC之間的NG接口&#xff1b;無線協議框架包括用戶面和控制面協議。 2 NG接口 2.1 NG用戶面接口 NG-U (user plane interface)是NG-RAN節點與UPF之間的接口。NG接口的用戶平面協議棧如圖…

AutoGen實戰應用(一):代碼生成、執行和調試

AutoGen 是一個支持使用多個代理來開發大型語言模型(LLM) 應用程序的框架&#xff0c;這些代理采樣相互對話的方式來解決人類交給的任務。AutoGen 代理是可定制的、可對話的&#xff0c;并且無縫地允許人類參與。他們采用LLM、人類輸入和各種工具組合的各種運作模式。 AutoGen …

二分查找25(Leetcode1498滿足條件的子序列數目)

代碼&#xff1a; 這道題不能用Math.pow 精度不夠 得自己寫個數組存2的n次方 class Solution {public int numSubseq(int[] nums, int target) {int mod 1000000007;int n nums.length;System.out.println(n);int[] f new int[100005];f[0]1;for(int i1;i<f.length;i){…

docker 安裝mysql 主從復制

一、搭建主服務器的mysql 1.1 先新建文件夾 mkdir -p /data/dockerData/mysql-master/conf 1.2 進入/data/dockerData/mysql-master/conf目錄下新建my.config, [mysqld] ## 設置server_id&#xff0c;同一局域網中需要唯一 server_id101 ## 指定不需要同步的數據庫名稱 bin…

論文閱讀《High-frequency Stereo Matching Network》

論文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/papers/Zhao_High-Frequency_Stereo_Matching_Network_CVPR_2023_paper.pdf 源碼地址&#xff1a; https://github.com/David-Zhao-1997/High-frequency-Stereo-Matching-Network 概述 在立體匹配研究領域…

web漏洞原理與防御策略,web漏洞怎么挖掘

目錄 Web安全的重要性 ?編輯常見的Web漏洞類型及其原理&#xff1a; 1、跨站腳本攻擊&#xff08;XSS&#xff09;: 2、SQL注入: 3、跨站請求偽造&#xff08;CSRF&#xff09;: 4、遠程文件包含&#xff08;RFI&#xff09;和本地文件包含&#xff08;LFI&#xff09;:…

Spring Boot實現接口冪等

Spring Boot實現接口冪等 1、pom依賴 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:…

大創項目推薦 協同過濾電影推薦系統

文章目錄 1 簡介1 設計概要2 課題背景和目的3 協同過濾算法原理3.1 基于用戶的協同過濾推薦算法實現原理3.1.1 步驟13.1.2 步驟23.1.3 步驟33.1.4 步驟4 4 系統實現4.1 開發環境4.2 系統功能描述4.3 系統數據流程4.3.1 用戶端數據流程4.3.2 管理員端數據流程 4.4 系統功能設計 …

【軟件安裝】VMware安裝Centos7虛擬機并且設置靜態IP,實現Windows和Centos7網絡互相訪問

這篇文章&#xff0c;主要介紹VMware安裝Centos7虛擬機并且設置靜態IP&#xff0c;實現Windows和Centos7網絡互相訪問。 目錄 一、VMware安裝Centos7 1.1、下載Centos7鏡像 1.2、安裝Centos7系統 二、設置靜態IP地址 2.1、查看虛擬機網絡IP 2.2、禁用NetworkManager服務 …

每天五分鐘計算機視覺:VGG網絡相對于AlexNet網絡有哪些不同?

本文重點 在前面的課程中&#xff0c;我們已經學習了VGG網絡模型&#xff0c;也學習了AlexNet網絡模型&#xff0c;AlexNet模型先于VGG網絡模型產生&#xff0c;所以VGG在一定程度上要優于AlexNet模型&#xff0c;二者來看一下&#xff0c;二者究竟有什么不同&#xff1f; 深度…

Qt的坐標系系統 - 3個坐標系,2個變換

參考&#xff1a; https://zhuanlan.zhihu.com/p/584048811https://www.zhihu.com/tardis/zm/art/634951149?source_id1005 小談Qt的坐標系系統 Qt中有三個坐標系 設備坐標系窗口坐標系邏輯坐標系 設備坐標系: 即Device坐標系。也是物理坐標系。即真實的的物理坐標系。 …