C++ primer三章二節標準庫類型string

標準庫類型string

  • 標準庫類型string表示可變長的字符序列,使用#include<string>引入頭文件,string定義在命名空間std中。

定義和初始化string對象

  • 如何初始化類的對象是由類的本身決定的,類可以定義很多初始化對象的方式,但是這些方式之間必須有所不同,不同體現在初始值的數量、類型。
  • 常用的初始化的例子
string s1;           //空字符串
string s2(s1);       //將s1作為s2的初始值
string s2 = s1;      //和上面的一致string s3("Value");  //給s3賦value值
string s3 = "value"; //和上面一致string s4(n,'c');    //s4 = n個c

直接初始化和拷貝初始化

  • = 拷貝初始化,將等號右側的初始值拷貝到新創建的對象中去
  • 不使用等號,則執行的是直接初始化

string對象上的操作

  • 一個類除了要規定初始化其對象的方式外,還要定義對象上所能執行的操作。
  • 類既可以定義通過函數名字調用的操作,還可以定義<<、+等各種運算符在此類的對象上的新的含義。
  1. os<<s? ?將s寫到輸出流os中,返回s
  2. is>>s? ? 從is中讀取字符串賦值給s,字符串以空白分割,返回is
  3. getline(is,s)? 從is中讀取一行賦值給s,返回is
  4. s.empty() s為空返回true。否則返回false
  5. s.size()? ?返回s中的字符的個數
  6. s[n]? ? ? 返回s中第n個字符的引用,位置n從0開始計算
  7. s1+s2? 返回字符串s1和s2拼接的效果
  8. s1 = s2? 使用s2的副本代替s1中原來的字符
  9. s1 == s2? 如果s1和s2的字符完全一致,則他們相等
  10. s1 != s2
  11. <、<=、>、>=? 按照字典順序比較大小,且大小寫比較敏感

讀寫string對象

  • 讀取操作的時候,string對象會自動忽略開頭的空白(空格符、換行符、指標符),并從第一個真正的字符開始讀起,直到遇見下一處的空白為止。例如輸入“? ? ?Hello? ? ? ?”,接收的卻是“Hello”,輸出的結果中沒有空格。
  • 多個輸入或者輸出可以連寫在一起。

讀寫未知數量的string對象

int main(int argc,char **argv){string word;while(cin >> word){cout << word << endl;}return 0;
}

使用getline讀取一行

  • 保留輸入的時候的空白符號,使用getline()替代先前的>>運算符號
  • getline只要一遇到換行符號就會結束讀取操作并且返回結果,即使一開始輸入的就是換行符號,那么返回的就是空字符串。
int main(int argc,char **argv){string word;while(getline(cin,word)){cout << word << endl;}return 0;
}

string的size操作

  • size函數返回的是一個string::size_type類型的值,這是一個無符號類型的數值,而且可以存放下任何string對象的大小。在C++11中允許使用auto或者decltype來判斷變量的類型。
  • 如果表達式已經有了size()函數既不要使用int了,可以避免混用int和unsigned可能帶來的問題。

比較string對象

  • ==和!=分別校驗兩個對象相等還是不相等。相等是指兩個對象的長度和所蘊含的字符完全一致。
  • < <= >= > 和先前的認知是一致的,比較區分大小寫,按照字典序來比
  • 如果兩個字符一短一長,短的所有位數和長的先前位數是一致的,那么小的小于長的
  • 如果在某些位置上面元素不一致,以第一對相異字符比較結果作為整體比較結果。

兩個string對象相加

  • 這個 + 符號和Java是一樣的,默認是字符串的拼接
  • 如果將string對象、字符字面值和字符串字面值混在一起使用,需要保障每一個加法運算符 + 的兩側的運算符對象至少有一個是string。
    string s1 = "Hello";string s2 = "World";string s3 = s1 + "," + s2 + '\n';string s4 = s1 + ",";string s5 = "Hello" + "\n";//錯誤,兩個運算對象都不是stringstring s6 = s1 + "," + "World";string s7 = "Hello " + "," + s2;//錯誤,不能把字面值直接相加

處理string對象中的字符

引入cctype頭文件就可以引入一些標準庫函數來處理字符

isalnum(c)c是字母或者數字為真
isalpha(c)c是字母為真
iscntrl(c)c是控制字符為真
isdigit(c)c是數字為真
isgraph(c)c不是空格但是可以打印的時候為真
islower(c)c是小寫字母為真
isprint(c)c可打印為真(c是空格或者c具有可見的形式)
ispunct(c)c標點符號為真
isspace(c)c空白為真
issupper(c)c大寫字母為真
isxdigit(c)c是十六進制為真
tolower(c)若c大寫,則轉化為小寫字母
toupper(c)若c小寫,則轉化為大寫字母
  • C++在兼容C語言的庫,去掉.h,在頭文件的名字前面增加字母c即可。

使用for來處理每一個字符

  • 將每一個字符改成小寫
int main(int argc,char **argv){string s = "HELLO WORLD!!!";for(auto &c : s) {  //對于s中的每一個字符,其中&表示引用c = tolower(c); //c是一個引用,因此賦值語句將會改變c的數值}cout << s << endl;return 0;
}
  • ?處理特定位置的字符:1,使用下標;2,使用迭代器
  • 下標運算符號[] 接收的輸入值是string::size_type類型的數值,這個參數表示的是訪問字符的位置,返回的是該位置上字符的引用。字符對象的下標從0開始計算,最大的下標是s[s.size()-1]

補充知識

  • decltype關鍵字用于查詢表達式的類型
  • 詳細的參考鏈接地址?https://blog.csdn.net/caoshangpa/article/details/79129258

?

?

?

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

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

相關文章

vim 不常見但好用的命令

● 跳躍 ○ 向前跳躍是 f ○ 向后跳躍是 F ● 繼續 ○ 保持方向是 ; ○ 改變方向是 , ● 可以加上 [count] 來加速 ● ^ 是到本行第一個非空字符 ● 0 是到本行第一個字符&#xff0c;不管是不是空格 ● g_ 是到本行最后一個非空字符 ● 兩個按鍵要依次按下 ● $ 跳到本行最后…

加密機組會 會議紀要

2020年9月28日 1&#xff0c;使用基類繼承的機制&#xff0c;調用寫好的函數接口 1&#xff0c;不要 使用Content&#xff08;封裝數據&#xff0c;本質是一個json字符串&#xff09;&#xff0c;1&#xff0c;因為每次使用這個需要對里面的內容進行序列化&#xff0c;轉化成…

c++為什么沒有垃圾回收

垃圾回收 內存清理的另一個方面是垃圾回收。在支持垃圾回收的環境中&#xff0c;程序員幾乎不必顯式地釋放與對象關聯的 內存。運行時庫會在某時刻自動清理沒有任何引用的對象。 與C#和Java不一樣&#xff0c;在C語言中沒有內建垃圾回收。在現代C中&#xff0c;使用智能指針管理…

C++ Vecctor容器淺析

Vector的定義 向量&#xff08;Vector&#xff09;是一個封裝了動態大小數組的順序容器&#xff08;Sequence Container&#xff09;。跟任意其它類型容器一樣&#xff0c;它能夠存放各種類型的對象。可以簡單的認為&#xff0c;向量是一個能夠存放任意類型的動態數組。vector…

C++primer第二章2.4節對于const限定符相關內容進行詳解

const限定符 const對象一旦創建后其數值就不會被再次改變&#xff0c;因此const對象必須初始化。const對象只在文件中有效在不同的文件中使用不同的const來定義不同的常量&#xff0c;那么每個文件定義的變量只會在自己所屬的文件中有效。如果想讓多個文件共享同一個const變量…

二分法的常見問題

mid(leftright)/2; mid (high - low) / 2 low; 這樣寫可以防止left right溢出 ,不過數足夠大是時候該溢還是溢 為什么要取右邊中間數呢&#xff1f;這是因為在區間里 只有 2 個元素的時候&#xff0c;把[left…right]劃分成[left…mid - 1]和[mid…right]這兩個區間&#x…

演示IPFS的一個完整的流程以及針對部分概念的詳解

整體的流程 1&#xff0c;創建ipfs節點 通過ipfs init在本地計算機建立一個IPFS節點本文有些命令已經執行過了&#xff0c;就沒有重新初始化。部分圖片拷貝自先前文檔&#xff0c;具體信息應以實物為準 $ ipfs init initializing IPFS node at /Users/CHY/.ipfs generating 2…

c++ 算法的時間復雜度

一般ACM或者筆試題的時間限制是1秒或2秒。 在這種情況下&#xff0c;C代碼中的操作次數控制在 10^7為最佳。 下面給出在不同數據范國下&#xff0c;代碼的時間復雜度和算法該如何選擇&#xff1a; 1.n≤ 30,指數級別&#xff0c;dis剪枝&#xff0c;狀態壓縮dp 2.n < 100 &g…

簡單工廠模式實現計算器

#include <iostream> #include <vector> #include <string> #include <iostream> #include <map> using namespace std; #define __THROW_ZERO do {cerr << "The dividend is 0" << endl; exit(1);}while(0);/* 簡單工廠處…

TDengine安裝教程

TDengine安裝教程 前言 TDengine的安裝十分簡單&#xff0c;可以有以下三種安裝方式&#xff0c;源碼安裝、通過Docker容器進行安裝、通過安裝包進行安裝。但是使用源碼安裝較為復雜&#xff0c;通過docker的方式最為簡單&#xff0c;但是需要一定docker相關的知識&#xff0…

C++中size_t的學習

size_t的定義 size_t是一種數據相關的無符號類型&#xff0c;它被設計得足夠大以便能夠存儲內存中任意對象的大小。設計 size_t 就是為了適應多個平臺&#xff0c;size_t等效于unsigned short int 或者 unsigned long int 類型&#xff0c;這個過程是動態匹配的。在需要通過數…

策略模式解決商店打折問題

#include <bits/stdc.h> using namespace std; /*策略模式解決商店打折問題*/class Cashsuper { private:/* data */ public:virtual double addcash(double cash) 0;double Getresult(double money){return addcash(money);} };class Cashnormal : public Cashsuper {p…

android 軟件首次運行時引導頁左右滑動效果

很多手機軟件在安裝后首次運行都會進入到引導頁面&#xff0c;再次運行時會進入到主頁面。 多了不說了&#xff0c;先看效果圖&#xff1a; 代碼如下&#xff1a; main.xml <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:an…

C++中size_type類型詳解

介紹 是和string類類型和vector類類型定義相關的類型&#xff0c;用以保存任意string對象或vector對象的長度&#xff0c;標準庫類型將size_type定義為unsigned類型string抽象意義是字符串&#xff0c; size&#xff08;&#xff09;的抽象意義是字符串的尺寸&#xff0c; str…

單一職責原則 實現貪吃蛇代碼的封裝

單一職責原則(SRP),就一個類而言&#xff0c;應該僅有一個引起它 變化的原因。 一個c語言的貪吃蛇代碼 如何使用單一職責原則封裝成c面向對象呢 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include <wi…

android ProgressBar實現掃描SD卡文件 + SimpleAdapter綁定ListView

代碼 activity_main.xml <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:layout_height"match_parent"to…

C++標準庫函數begin和end函數

主要的目的 為了讓指針更加簡單、安全&#xff0c;引入了begin和end函數&#xff0c;這兩個函數和容器中兩個同名的成員函數類似。但是由于數組畢竟不是類類型&#xff0c;因此這兩個函數不是成員函數。正確的使用形式就是將數組作為他們的參數int ia[] {0,1,2,3,4,5,6,7,8,9…

dex分包之--------multidex包的配置使用

目錄&#xff1a;一、前言二、產生原因三、MultiDex的簡要原理四、MultiDex的使用 一、前言 首先說一下我遇到的情況&#xff0c;最近接手了一個項目是在已有的項目里進行更新添加一些功能&#xff0c;然后該項目導了N多的包&#xff0c;在我使用Android Studio的run”App”直…

C++ primer第六章函數的學習

介紹 首先介紹函數的定義和聲明&#xff0c;包括如何傳入參數以及函數如何返回結果。C語言允許使用重載函數&#xff0c;即幾個不同的函數可以使用向同一個名字。所以接下來介紹重載函數的方法&#xff0c;以及編譯器選擇如何從函數的若干重載的形式中選取一個與調用模板相互匹…