目錄結構:
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 #includeusing
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 #includeusing
namespace
std;
intmain()
輸出結果為:
10
-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 也可以定義字元陣列。但由於兩種型別分配位元組不同,用整型來定義會浪費空間,另外這樣定...