C C 中的字元和字串

2022-05-02 23:24:12 字數 4476 閱讀 9331

目錄結構:

contents structure

[-]定義和初始化string

string物件上的操作

處理string物件中的字元

c風格字串

標準庫型別string表示可變長的字串行,使用string型別必須首先包含string標頭檔案,作為標準庫的一部分string定義在標準庫std中。

#include //

引用標頭檔案

using std::string;

如何初始化類由類本身決定,乙個類可以定義多種初始化物件的方式。

string s1;//

預設初始化

string s2(s1);//

s2是s1的副本

string s2 = s1;//

等價於s2(s1),s2是s1的副本

string s3("

value

");//

s3是字面值"value"的副本,除了字面值最後的那個空字元外

string s3 = "

value

";//

等價於s3("value"),s3是字面值"value"的副本

string s4(n,'

c');//

把s4初始化為由連續n個字元'c'組成的串

乙個類除了要規定初始化其物件的方式外,還要定義物件上所能執行的操作。下面是string物件的大多數操作。

os << s //

將s寫到輸出流os當中,返回os

is >> s //

從輸入流is中讀取字串賦給s,字串以空白分割,返回is

getline(is,s) //

從is中讀取一行賦給s,返回is

s.empty() //

s為空返回true否則返回false

s.size() //

返回s中字元的個數

s[n] //

返回s中第n個字元的引用,位置n從0開始

s1+s2 //

返回字串s1和s2連線後的結果

s1=s2 //

用s2的副本代替s1中原來的字元

s1==s2 //

如果字串s1和字串s2中的字元完全一樣,則返回true,否則為false

s1!=s2 //

如果字串s1和字串s2中的字元不一樣,則返回true,否則返回false

<,<=,>,>= //

利用字元在字典中的順序進行比較,且對字母的大小寫敏感

下面的案例展示部分方法的使用,案例:

#include #include 

using

namespace

std;

intmain()

//使用指標迴圈輸出每個字元

for(char *c = &s[0], c!=&s[s.size()]; c++)

cout

}

begin()返回指向首元素的迭代器,end()返回指向尾元素下一元素的迭代器。

由於字串的size()方法的返回值是size_type型別,一種無符號整數型別,所以如果n是乙個負數,那麼下面的例子總是成立的s.size() < n,因為n會自動轉化為乙個較大的無符號值。因此需要判斷字串的大小,應該先把s.size()的型別轉化為有符號的整形,然後再和n比較。例如:

#include #include 

using

namespace

std;

intmain()

輸出結果為:

1

0

-10是有符號整形,在和無符號整形比較時候,會自動轉化為乙個較大的無符號整形(只有負數才會發生轉化,正數不會發生)。所以正確的思路應該是,先把無符號整形轉化為有符號整形,然後再比較。或是兩個都是無符號整形。

在標頭檔案中,定義了一系列的標準字元處理函式。是c語言標頭檔案ctype.h的版本。

下面列舉了一些主要函式:

isalnum(c)//

當c是字母或數字時為真

isalpha(c)//

當c是字母時為真

isdigit(c)//

當c是數字時為真

ispunct(c)//

當c是標點符號時為真

isspace(c)//

當c是空格時為真

islower(c)//

當c是小寫字母時為真

isupper(c)//

當c是大寫字母時為真

tolower(c)//

將c轉化為小寫字母

toupper(c)//

將c轉化為大寫字母

案例:

#include #include 

#include

using

namespace

std;

intmain()

for(auto &a : str)

for(char *c=&str[0]; c!=&str[str.size()]; c++)

return0;

}

字串字面值是一種通用結構的例項,這種結構是從c繼承而來的c風格字串(c-style character string),c風格字串不是一種型別,而是一種約定俗成的寫法,按照書寫習慣,一般以空字元結束(null terminated),以空字元結尾的意思就是在字串的最後乙個字元後面加上'\0',一般利用指標來操作這些字串。

同時在c++中的標頭檔案中,cstring是c語言標頭檔案string.h的c++版本。

strlen(p) //

返回p的長度,空字元不計算在內

strcmp(p1,p2) //

比較p1和p2的相等性,如果p1==p2,那麼返回0。如果p1>p2,那麼返回乙個正值。如果p1strcat(p1,p2) //

將p2附加到p1後,返回p1

strcpy(p1,p2) //

將p2拷貝給p1,返回p1

在用陣列的形式初始化字元陣列時,一定要以空字元『\0』結尾。在使用字串初始化字元陣列時,會自動在末尾加上空字元'\0'。同時,標準庫中的方法,都是空字元結尾作為字元結尾的標誌,如果未加空字元結尾,那麼可能發生意想不到的結果。

char ch = ;//

這裡要以空字元結束

cout << strlen(ch) << endl;//

3char ch2 = "

c++";//

當把字串賦值給char時,會自動在末尾新增\0

for(char *c=ch2; *c!='

\0'; c++)

字元陣列在使用他的名稱的時候,編譯器會在不同的位置給他編譯成不同的型別。

例如:

#include #include 

#include

using

namespace

std;

intmain();

for(char *ch=c; *ch!='

\0';ch++)//

這裡將c編譯成首元素的位址

cout << *ch

<< c << endl;//

這裡輸出陣列中的所有元素

int i=;

cout

<< i

cout

<< s

}

輸入結果:

c

++c++

0x7ffc37de8200

0x7ffc37de81c0

從結果中可以看出,當單獨使用字元陣列名稱時,它會遍歷其中的所有字元。當和指標聯合使用時,它會返回首元素的指標。然而其他的陣列(int,string)都沒有這個特性。

除了上面的寫法,還可能會看到下面的這種寫法(讓乙個char指標指向乙個字串字面值常量,不是string):

char *cp = "

c++";//

等同於char *cp = "c++\0";

這種情況下,cp是乙個字元指標。而且在單獨使用cp的時候,也會遍歷他的所有字元。當使用*cp時代表指向字元的首元素。

可以使用如下的方式遍歷:

for(char *p = cp; *p!="

\0"; p++)//

注意這裡是雙引號"\0",不是單引號

cout << *p << endl;

如何把乙個string轉化為char資料

可以使用strcpy,copy來實現:

#include /*

cout

*/#include

/*string

*/#include

/*strcpy

*/int

main()

C C 中的字元和字串輸入

毫無疑問,大家在c中都採用scanf來輸入,在c 中採用cin輸入,那麼這兩個到底有什麼不同之處呢,以及如何在適當的時候選擇合適的方法讀入字元和字串呢。鑑於在vs中一些函式如scanf無法使用,改為更安全的scanf s,所以本文的 只在dev c 中執行。首先我們來講一下字元和字串的基本知識。在c...

C C 中的字串

getch函式 head file include conio.h 功能 從控制台無回顯的讀取乙個字元 用法 int void getch 該函式函式經常用於互動輸入的過程中完成暫停等功能 getche函式 head file include conio.h 功能 從控制台帶回顯的讀取乙個字元 用法...

C C 字串和字元陣列

c語言中沒有專門的字串變數,如果要將乙個字串存放在變數中,必須使用字元陣列,即用乙個字元型陣列來存放乙個字串,陣列中每乙個元素存放乙個字元。1 定義 char c 10 字元型與整型互相通用,因此 int c 10 也可以定義字元陣列。但由於兩種型別分配位元組不同,用整型來定義會浪費空間,另外這樣定...