一旷太、字符串字面值
字符串字面值是一串常量字符,字符串字面值常量用雙引號括起來的零個或多個字符表示,為兼容C語言,C++中所有的字符串字面值都由編譯器自動在末尾添加一個空字符钠至。
字符串沒有變量名字掰盘,自身表示自身
"Hello World!"http://simple string literal
""http://empty string literal
"\nCC\toptions\tfile.[cC]\n"http://string literal using newlines and tabs
字符字面值: 'A' //single quote:character literal
字符串字面值: "A" //double quote:character string literal.包含字母A和空字符的字符串
字符串字面值的連接:
std::out<<"a multi-line"+
"string literal"+
"using concatenation"
<< std::endl;
輸出:a multi-line string literal using concatenation
多行字面值:
std::out<<"a multi-line \n
stringliteral\n
usinga backslash"
<< std::endl;
輸出:a multi-line string literalusing a backslash
=================================================
1. string literal:字符串直接量:
cout<<"hello"<
代碼中通過包含"hello"字符串自身來將其輸出,并未包含該字符串的變量。
2. 字符串直接量可以賦值給變量,但是與字符串直接量相關聯(lián)的內存空間位于只讀部分泻云,因此它是常量字符數(shù)組婆瓜。
char* ptr ="hello";
ptr[1] ='a';//crash! attemps to write to read-only memory.
因此,當引用字符串直接量的時候使用指向const的字符數(shù)組:
constchar* ptr ="hello";
ptr[1] ='a';//bug! attempts to write to read-only memory.
3. 當將字符串直接量賦值給字符數(shù)組的初始值的時候晕讲。由于字符數(shù)組存放與棧中,不允許引用其他地方的內存摹量,因此編譯器會將字符串直接量復制到站的數(shù)組內存中祝迂。因此,可以進行相應的修改。
charstackArray[] ="hello";
stackArray[1] ='a';
二、C++風格字符串
C++風格字符串:使用C++風格字符串的時候涌庭,要將它當做是一個普通的類型,如int豪诲,這樣反而會避免將string作為一個類來理解所帶來的很多問題交播。
1. 支持中許多函數(shù)完成的同樣操作。
2. 字符串定義:
stringmyString = “hello”;
3. 操作符 = :復制字符串;比如:
stringnewone = original;
會將后者復制給前者亥啦,不會出現(xiàn)兩個變量同樣指向一個內存的情況届吁。
4. 可以像int一樣使用 == 之類的操作符
5. 可以改變字符串中的某一個字符。 如
stringmyString ="hello"; mystring[0] ='l';
這中操作是允許的擎厢。
三厘惦、C風格字符串
字符串字面值的類型實質是const char類型的數(shù)組缝左。C++從C語言繼承下來的一種通用結構是C風格字符串碌上,而字符串字面值就是該類型的實例。C風格字符串是以空字符null結束的字符數(shù)組:
charca1[]={'C','+','+'};//no null, not C-style string
charca2[]={'C','+','+','\0'};//explicit null
charca3[]="C++";//null terminator added automatically
constchar*cp="C++";//null terminator added automatically
char*cp1=ca1;//points to first element of a array, but not C-style string
char*cp2=ca2;//points to first element of a null-terminated char array
ca1和cp1都不是C風格字符串:ca1是一個不帶結束符null的字符數(shù)組,而指針cp1指向ca1,因此妖混,它指向的并不是以null結束的數(shù)組误褪。
2.1 C風格字符串的使用
C++語言通過(const) char *類型的指針來操縱C風格字符串兽间。
constchar*cp ="some value";//一個C風格字符串
while(*cp)//判斷cp當前指向的字符是true還是false问裕,true表明這是除null外的任意字符
{
//do something to *cp
++cp;
}
2.2 C風格字符串的標準庫函數(shù)
#include //cstring是string.h頭文件中的C++版本粮宛,而string.h是C語言提供的標準庫
//操縱C風格字符串的標準庫函數(shù)(參數(shù)類型省略词裤,都是char *類型):
strlen(s)//返回s的長度因俐,不包括字符串結束符null
strcmp(s1, s2)//當s1s2時,返回值>0
strcat(s1, s2)//將字符串s2連接到s1后弓柱,并返回s1
strcpy(s1, s2)//將s2復制給s1,并返回s1
strncat(s1, s2, n)//將s2的前n個字符連接到s1后面矢空,并返回s1
strncpy(s1, s2, n)//將s2的前n個字符復制給s1航罗,并返回s1
if(cp1 < cp2)//compares address, not the values pointed to
constchar*cp1 ="A string example";
constchar*cp2 ="A different string";
inti=strcmp(cp1, cp2);//i is positive
i=strcmp(cp2, cp1);//i is negative
i=strcmp(cp1, cp1);//i is zero
2.3 永遠不要忘記字符串結束符null
charca[]={'C','+','+'};//not null-terminated
cout << strlen(ca) << endl;//disaster: ca isn't null-terminated
2.4 調用者必須確保目標字符串具有足夠的大小
//Dangerous:What happens if we miscalculate the size of largeStr?
charlargeStr[16+18+2];//will hold cp1 a space and cp2
strcpy(largeStr, cp1);//copies cp1 into largeStr
strcat(largeStr,"");//adds a space at end of largeStr
strcat(largeStr, cp2);//concatenates cp2 to largeStr
//prints A string example A different string
cout << largeStr << endl;
2.5 使用strn函數(shù)處理C風格字符串
charlargeStr[16+18+2]//to hold cp1 a space and cp2
strncpy(largeStr, cp1,17);//size to copy includes the null
strncat(largeStr,"",2);//pedantic, but a good habit
strncat(largeStr, cp2,19);//adds at most 18 characters, plus a null
2.6 盡可能使用標準庫類型string
stringlargeStr = cp1;//initialize largeStr as a copy of cp1
largeStr +="";//add space at end of largeStr
largeStr += cp2;//concatenate cp2 onto end of largeStr
此時,標準庫負責處理所有的內在管理問題屁药。
原文地址:http://www.cnblogs.com/coveted/archive/2011/12/28/2304509.html