string類的相關知識及部分操作

文章目錄

  • string對象的初始化
  • string::size_type類型
  • string對象的讀寫操作
    • 使用標準庫中的iostream
    • 使用getline讀取一整行
  • string對象的比較操作
  • string對象的相加操作
    • 兩個string對象相加
    • 字面值和string對象相加


string對象的初始化

拷貝初始化(copy initialization):使用等號(=)初始化一個變量

直接初始化(direct initialization):不使用等號

當初始值只有一個時,使用兩種初始化都行。如果用到的初始值有多個,一般來說只能使用直接初始化的方式:

string s5 = "hiya"; // 拷貝初始化
string s6("hiya); // 直接初始化
string s7(10, 'c'); //直接初始化

非要用拷貝初始化的方式來處理多個初始值也不是不可以,不過需要顯式地創建一個(臨時)對象用于拷貝:

string s8 = string(10, ' c');

等價于:

string temp(10, ' c');
string s8 = temp; // 將temp拷貝給s8

盡管初始化s8的語句合法,但和初始化s7的方式比較起來可讀性較差,也沒有任何補償優勢,因此不建議采用。



string::size_type類型

string::size_type類型是szie函數(例如:empty函數、size函數)返回值的類型。是一個無符號類型的值,而且足夠存放下任何string對象的大小

所有用于存放string類的size函數返回值的變量,都應該是string::size_type類型的。

由于size函數返回的是一個無符號整型數,因此如果在表達式中混用了帶符號數和無符號數將可能產生意想不到的結果。例如,假設n是一個具有負值的int,則表達式s.size()<n的判斷結果幾乎肯定是true。因為負值n會自動地轉換成一個比較大的無符號值。

PS:如果一條表達式中已經有了size()函數就不要再使用int了,這樣可以避免混用int和unsigned可能帶來的問題。



string對象的讀寫操作

使用標準庫中的iostream

執行讀取操作時,string對象會自動忽略開頭的空白(空格符、換行符、制表符等)并從第一個真正的字符開始讀起,直到遇見下一處空白為止。

例如:如果程序輸入:

     hello world        

則輸出將是:

hello

輸出結果中沒有任何空格。


使用getline讀取一整行

getline函數的參數是一個輸入流和一個string對象,函數從給定的輸入流中讀入內容,直到遇到換行符為止(換行符也被讀進來),然后把所讀的內容存入到那個string對象中去(不存換行符)。

getline只要一遇到換行符就結束讀取操作并返回結果,哪怕輸入的一開始就是換行符也是如此。如果輸入一開始就是換行符,那么所得的結果是個空string。

PS:觸發getline函數返回的那個換行符實際上被丟棄掉了,得到的string對象中并不包含該換行符。



string對象的比較操作

string對象相等意味著它們的長度相同、所包含的字符也全都相同。

檢驗兩個string對象之間關系的關系運算符都依照(大小寫敏感的)字典順序:

  1. 如果兩個string對象的長度不同,而且較短的string對象的每個字符都與較長string對象對應位置上的字符相同,就說較短string對象小于較長string對象。
  2. 如果兩個string對象在某些對應的位置上不一致,則string對象比較的結果其實是string對象中第一對相異字符比較的結果

舉例:

string str = "Hello";
string phrase = "Hello World";
string slang = "Hiya";

根據規則1可判斷,對象str小于對象phrase;根據規則2可判斷,對象slang大于phrase,那么同理也大于str。



string對象的相加操作

兩個string對象相加

兩個string對象相加得到一個新的string對象,其內容是把左側的運算對象與右側的運算對象串接而成。

string s1 = "hello,", s2 = "world\n";
string s3 = s1 + s2;
//s3的內容是hello,world\n

字面值和string對象相加

因為標準庫允許將字符字面值和字符串字面值轉換成string對象,所以string對象可以用這兩種字面值來替代。

 string s1 = "hello", s2 = "world";string s3 = s1 + "," + s2 + '\n';

當將string對象和字面值混在一條語句中使用時,必須確保每個加法運算符的兩側的對算對象至少有一個是string:

string s4 = s1 + ","; // 正確
string s5 = "hello" + ","; // 錯誤:兩個運算對象都不是string
string s6 = s1 + "," + "world"; // 正確
string s7 = "hello" + "," + s2; // 錯誤

s6和s7的工作機理和連續輸入連續輸出是一樣的,可以用如下形式分組:

string s6 = (s1 + ",") + "world"; 

其中子表達式s1 + ","的結果是一個string對象,同時作為第二個加法運算符的左側運算對象,因此上述語句和下面的兩個語句是等價的:

string tmp = s1 + ",";
s6 =  tmp + "world";

另一方面,s7的初始化是非法的,根據其語義加上括號后就成了下面的形式:

string s7 = ("hello" + ",") + s2;

很容易看到,括號內的子表達式試圖把兩個字符串字面值加在一起,而編譯器根本沒法做到這一點,所以這條語句是錯誤的。

PS:因為某些歷史原因,也為了與C兼容,所以C++語言中的字符串字面值并不是標準庫類型string對象。切記,字符串字面值和string是不同的類型。



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

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

相關文章

數組的部分練習

3.27&#xff1a;假設txt_size是一個無參數的函數&#xff0c;它的返回值是int。請回答下列哪個定義是非法的&#xff1f;為什么&#xff1f; unsigned buf_size1024; &#xff08;a&#xff09;int ia[buf_size];  &#xff08;b&#xff09;int ia[4*7-14]; &#xff08…

關于范圍for語句的使用

文章目錄使用范圍for語句處理多維數組使用范圍for語句處理多維數組 舉個例子&#xff0c;使用范圍for語句輸出多維數組&#xff08;ia&#xff09;所有值&#xff1a; for (const auto &row : ia)for (auto col : row)cout << col << endl;本循環中并沒有任何…

vector的應用練習

文章目錄編寫一段程序&#xff0c;使用條件運算符從vector< int >中找出哪些元素的值是奇數&#xff0c;然后將奇數值翻倍。 #include <iostream> #include <ctime> #include <vector> using namespace std; typedef int int_array[4]; int main() {v…

sizeof運算符運算結果小匯

文章目錄sizeof運算符的結果部分地依賴于其作用的類型sizeof運算符的結果部分地依賴于其作用的類型 對char或者類型為char的表達式執行sizeof運算&#xff0c;結果得1對引用類型執行sizeof運算得到被引用對象所占空間的大小對指針執行sizeof運算得到指針本身所占空間的大小對解…

jQuery實現復選框的全選和反選:

jQuery實現復選框的全選和反選&#xff1a; 截圖如下&#xff1a; 代碼如下&#xff1a; index.jsp: <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <%String path request.getContextPath();String basePath…

C語言隱式/顯式類型轉換 | C++四種強制類型轉換、類的隱式轉換、explicit

文章目錄C語言類型轉換隱式類型轉換顯式類型轉換C 強制類型轉換static_castreinterpret_castconst_castdynamic_cast類的隱式類型轉換概念只允許一步類類型轉換explicit 抑制構造函數定義地隱式轉換可以通過顯式轉換使用explicit構造函數C語言類型轉換 隱式類型轉換 編譯器在…

string對象和C風格字符串

混用string對象和C風格字符串 我們都知道允許使用字符串字面值來初始化string對象&#xff1a; string s("Hello World!");C規定&#xff0c;任何出現字符串字面值的地方都可以用以空字符結束的字符數組來替代&#xff1a; 允許使用以空字符結束的字符數組來初始化…

函數重載、引用再探、內聯函數

文章目錄函數重載為什么C支持重載&#xff0c;C語言不支持呢&#xff1f;extern “C”引用再探引用的特性引用的使用場景引用和指針引用和指針的不同點:內聯函數什么是內聯函數&#xff1f;內聯函數的特性內聯函數的好處類的內聯成員函數的聲明內聯函數的使用constexpr函數概念…

類的概念、成員函數的定義方式、類的訪問控制和封裝、類的大小、this指針

文章目錄類的概念structclassclass和struct的區別是什么呢&#xff1f;類中成員函數的兩種定義方式聲明和定義都在類中聲明和定義分離類的訪問控制和封裝類的封裝特性類的大小結構體內存對齊規則類的存儲方式this指針類的概念 在C中&#xff0c;類可以說是最重要的東西&#x…

jQuery實現兩個列表框的值之間的互換:

jQuery實現兩個列表框的值之間的互換&#xff1a; 截圖如下&#xff1a; 代碼如下&#xff1a; <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <%String path request.getContextPath();String basePath reque…

類的6個默認成員函數:構造函數、析構函數、拷貝構造函數、重載運算符、三/五法則

文章目錄6個默認成員函數構造函數概念默認構造函數的類型默認實參概念默認實參的使用默認實參聲明全局變量作為默認實參某些類不能依賴于編譯器合成的默認構造函數第一個原因第二個原因第三個原因構造函數初始化構造函數里面的“”是初始化嗎&#xff1f;為什么要使用列表初始化…

C++ 類的知識 | 構造函數再探、匿名對象、友元函數、內部類、類的const成員、類的static成員

文章目錄構造函數再探以下代碼共調用多少次拷貝構造函數委托構造函數概念形式匿名對象友元友元的聲明友元類令成員函數作為友元函數重載和友元注意內部類特性類的const成員可變數據成員類的static成員概念關于static靜態成員的類內初始化靜態成員能用于某些普通成員不能的場景構…

截取全部數值字符并將其轉化為數值類型

功能 從name中找出全部數值字符&#xff0c;之后將name&#xff08;string類&#xff09;轉為d&#xff08;double類&#xff09; 代碼 #include <iostream> #include <list> #include <deque> #include <vector> #include <forward_list> #i…

替換string中的部分字符

功能 向函數fun中傳入三個參數&#xff1a;將s中所有oldval替換為newval 代碼 #include <iostream> #include <list> #include <deque> #include <vector> #include <forward_list> #include <array> using namespace std;void fun(str…

順序容器(vector、list、string、deque、forward_list)及迭代器、容器適配器

文章目錄概述所有容器都支持的操作迭代器迭代器支持的操作迭代器支持的算術運算容器類型size_typeiterator 和 const_iterator容器定義和初始化拷貝初始化順序容器獨有的構造函數&#xff08;array除外&#xff09;array的初始化與內置數組類型的區別6種初始化方法&#xff08;…

jQuery實現表格隔行換顏色:

jQuery實現表格各行換顏色&#xff1a; 截圖如下&#xff1a; 代碼如下&#xff1a; <span style"font-family:Microsoft YaHei;font-size:14px;"><% page language"java" import"java.util.*" pageEncoding"UTF-8"%> &…

用stack處理中綴表達式【+、-、*、/、()】

文章目錄題目描述思路使用getline()存儲輸入的字符串邊讀取邊壓棧完整代碼題目描述 使用stack處理括號化的表達式。當你看到一個左括號&#xff0c;將其記錄下來。當你在一個左括號之后看到一個右括號&#xff0c;從stack中pop對象&#xff0c;直至遇到左括號&#xff0c;將左括…

原地置換法尋找數組中重復的數

文章目錄題目描述代碼實現題目描述 在一個長度為 n 的數組 nums 里的所有數字都在 0&#xff5e;n-1 的范圍內。數組中某些數字是重復的&#xff0c;但不知道有幾個數字重復了&#xff0c;也不知道每個數字重復了幾次。請找出數組中任意一個重復的數字。 輸入&#xff1a; [2,…

二維數組的查找

文章目錄題目描述思路注意代碼題目描述 在一個 n * m 的二維數組中&#xff0c;每一行都按照從左到右遞增的順序排序&#xff0c;每一列都按照從上到下遞增的順序排序。請完成一個高效的函數&#xff0c;輸入這樣的一個二維數組和一個整數&#xff0c;判斷數組中是否含有該整數…

雙指針

文章目錄題目描述思路注意代碼實現題目描述 請實現一個函數&#xff0c;把字符串 s 中的每個空格替換成"%20"。 示例 1&#xff1a; 輸入&#xff1a;s “We are happy.” 輸出&#xff1a;“We%20are%20happy.” 限制&#xff1a; 0 < s 的長度 < 10000 思…