亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c字符串,string對象,字符串字面值的區(qū)別詳解

 更新時間:2013年09月10日 10:20:27   作者:  
以下是對c字符串,string對象,字符串字面值的區(qū)別進(jìn)行了詳細(xì)的介紹,需要朋友可以 過來參考下

一、字符串字面值
字符串字面值是一串常量字符,字符串字面值常量用雙引號括起來的零個或多個字符表示,為兼容C語言,C++中所有的字符串字面值都由編譯器自動在末尾添加一個空字符。
字符串沒有變量名字,自身表示自身

復(fù)制代碼 代碼如下:

"Hello World!" //simple string literal
"" //empty string literal
"\nCC\toptions\tfile.[cC]\n" //string literal using newlines and tabs

字符字面值: 'A' //single quote:character literal
字符串字面值: "A" //double quote:character string literal.包含字母A和空字符的字符串

字符串字面值的連接:

復(fù)制代碼 代碼如下:

std::out << "a multi-line "+
"string literal"+
" using concatenation"
<< std::endl;

輸出:a multi-line string literal using concatenation

多行字面值:

復(fù)制代碼 代碼如下:

std::out << "a multi-line \n
string literal\n
using a backslash"
<< std::endl;

輸出:a multi-line string literalusing a backslash

=================================================

1. string literal:字符串直接量:

復(fù)制代碼 代碼如下:

cout<<"hello"<<endl;

代碼中通過包含"hello"字符串自身來將其輸出,并未包含該字符串的變量。

2. 字符串直接量可以賦值給變量,但是與字符串直接量相關(guān)聯(lián)的內(nèi)存空間位于只讀部分,因此它是常量字符數(shù)組。

復(fù)制代碼 代碼如下:

char* ptr = "hello";
ptr[1] = 'a';//crash! attemps to write to read-only memory.

因此,當(dāng)引用字符串直接量的時候使用指向const的字符數(shù)組:
復(fù)制代碼 代碼如下:

const char* ptr = "hello";
ptr[1] = 'a';//bug! attempts to write to read-only memory.

3. 當(dāng)將字符串直接量賦值給字符數(shù)組的初始值的時候。由于字符數(shù)組存放與棧中,不允許引用其他地方的內(nèi)存,因此編譯器會將字符串直接量復(fù)制到站的數(shù)組內(nèi)存中。因此,可以進(jìn)行相應(yīng)的修改。
復(fù)制代碼 代碼如下:

char stackArray[] = "hello";
stackArray[1] = 'a';

二、C++風(fēng)格字符串
C++風(fēng)格字符串:使用C++風(fēng)格字符串的時候,要將它當(dāng)做是一個普通的類型,如int,這樣反而會避免將string作為一個類來理解所帶來的很多問題。

1. 支持<cstring>中許多函數(shù)完成的同樣操作。
2. 字符串定義:

復(fù)制代碼 代碼如下:

string myString = “hello”;

3. 操作符 = :復(fù)制字符串;比如:
復(fù)制代碼 代碼如下:

string newone = original;

會將后者復(fù)制給前者,不會出現(xiàn)兩個變量同樣指向一個內(nèi)存的情況。
4. 可以像int一樣使用 == 之類的操作符
5. 可以改變字符串中的某一個字符。 如
復(fù)制代碼 代碼如下:

string myString = "hello"; mystring[0] = 'l';

這中操作是允許的。

2.1 C風(fēng)格字符串的使用
C++語言通過(const) char *類型的指針來操縱C風(fēng)格字符串。

復(fù)制代碼 代碼如下:

#include <cstring> // cstring是string.h頭文件中的C++版本,而string.h是C語言提供的標(biāo)準(zhǔn)庫

//操縱C風(fēng)格字符串的標(biāo)準(zhǔn)庫函數(shù)(參數(shù)類型省略,都是char *類型):
strlen(s) // 返回s的長度,不包括字符串結(jié)束符null
strcmp(s1, s2) //當(dāng)s1<s2時,返回值<0 ,當(dāng)s1=s2時,返回值=0 ,當(dāng)s1>s2時,返回值>0
strcat(s1, s2) // 將字符串s2連接到s1后,并返回s1
strcpy(s1, s2) // 將s2復(fù)制給s1,并返回s1
strncat(s1, s2, n) // 將s2的前n個字符連接到s1后面,并返回s1
strncpy(s1, s2, n) // 將s2的前n個字符復(fù)制給s1,并返回s1
if(cp1 < cp2) // compares address, not the values pointed to
const char *cp1 = "A string example";
const char *cp2 = "A different string";
int i=strcmp(cp1, cp2); // i is positive
i=strcmp(cp2, cp1); // i is negative
i=strcmp(cp1, cp1); // i is zero


2.3 永遠(yuǎn)不要忘記字符串結(jié)束符null
復(fù)制代碼 代碼如下:

char ca[]={'C', '+', '+'}; // not null-terminated
cout << strlen(ca) << endl; // disaster: ca isn't null-terminated

2.4 調(diào)用者必須確保目標(biāo)字符串具有足夠的大小
復(fù)制代碼 代碼如下:

// Dangerous:What happens if we miscalculate the size of largeStr?
char largeStr[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風(fēng)格字符串
復(fù)制代碼 代碼如下:

char largeStr[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 盡可能使用標(biāo)準(zhǔn)庫類型string
復(fù)制代碼 代碼如下:

string largeStr = cp1; // initialize largeStr as a copy of cp1
largeStr += " "; // add space at end of largeStr
largeStr += cp2; // concatenate cp2 onto end of largeStr

此時,標(biāo)準(zhǔn)庫負(fù)責(zé)處理所有的內(nèi)在管理問題。

三、C風(fēng)格字符串
字符串字面值的類型實(shí)質(zhì)是const char類型的數(shù)組。C++從C語言繼承下來的一種通用結(jié)構(gòu)是C風(fēng)格字符串,而字符串字面值就是該類型的實(shí)例。C風(fēng)格字符串是以空字符null結(jié)束的字符數(shù)組:

復(fù)制代碼 代碼如下:

char ca1[]={'C', '+', '+'}; // no null, not C-style string
char ca2[]={'C', '+', '+', '\0'}; // explicit null
char ca3[]="C++"; // null terminator added automatically
const char *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風(fēng)格字符串:ca1是一個不帶結(jié)束符null的字符數(shù)組,而指針cp1指向ca1,因此,它指向的并不是以null結(jié)束的數(shù)組。

字符串的連接:
1.c++中string可以替代c中的char數(shù)組且前者用起來更方便
。連接兩個string對象只需用'+';c字符串是用char數(shù)組實(shí)現(xiàn)的。以下都稱c字符串為char數(shù)組

例如:

復(fù)制代碼 代碼如下:

string s1="hello",s2="world";

          string s3=s1+s2;                  //也可以s3=s1+"world"

cout<<s3<<endl;//結(jié)果為helloworld


當(dāng)然還可以用+=連接。

2.還可以這樣連接一個string對象和char數(shù)組。

例如:

復(fù)制代碼 代碼如下:

string s1="hello";

          char s2[]="world";

cout<<s1+s2<<endl;//輸出結(jié)果為helloworld


但不能這樣連接兩個char數(shù)組或字符字面值。

例如:

復(fù)制代碼 代碼如下:

string s1="hello";

           string s2="world";

           string s3=s1+"world";//正確,可以連接一個string對象和字符串字面值

           string s4="hello"+"world";//錯誤,不能這樣連接連個字符串字面值

           char s5[]="world";

           string s6=s1+s5;//正確,可以連接一個string對象和char數(shù)組

           char s7[]="hello";

           stirng s8=s7+s5;//錯誤,不能這樣連接兩個char數(shù)組。


總而言之只能用+或+=連接兩個string對象或一個string對象和字符串字面值或一個string對象和char數(shù)組。

連接一個string對象和字符串字面值或char數(shù)組或返回的都是string對象,所以可以連接一個string對象和字符串字面值(或char數(shù)組)后再連接一個字符串字面值(或char數(shù)組)。

例如:

復(fù)制代碼 代碼如下:

string s;//初始化為空
char s1[]="hello";
char s2[]="world";
s=s+s1+s2;//正確

相關(guān)文章

  • 弦圖ZOJ 1015 Fishing Net 判定方法

    弦圖ZOJ 1015 Fishing Net 判定方法

    弦圖,算法完全按照CDQ的PPT上給的最大勢算法(MCS)完美消除序列..需要的朋友可以參考下
    2012-11-11
  • Qt5.9實(shí)現(xiàn)簡單復(fù)合圖形

    Qt5.9實(shí)現(xiàn)簡單復(fù)合圖形

    這篇文章主要為大家詳細(xì)介紹了Qt5.9實(shí)現(xiàn)簡單復(fù)合圖形,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語言深入了解函數(shù)

    C語言深入了解函數(shù)

    C語言函數(shù)是用來模塊化構(gòu)建程序的。如果你的功能少,你可以全都寫在mian函數(shù)中,但是當(dāng)實(shí)現(xiàn)功能多的時候,如果全寫在main的函數(shù)里,不僅代碼不美觀,而且函數(shù)實(shí)現(xiàn)的時候結(jié)構(gòu)復(fù)雜,代碼重復(fù)
    2022-05-05
  • C++ 獲取dll當(dāng)前路徑下所有文件

    C++ 獲取dll當(dāng)前路徑下所有文件

    本文主要介紹了C++ 獲取dll當(dāng)前路徑下所有文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • C++日期類計算器的模擬實(shí)現(xiàn)舉例詳解

    C++日期類計算器的模擬實(shí)現(xiàn)舉例詳解

    兩個日期之間相隔天數(shù)的計算網(wǎng)上有許多的軟件,這里主要介紹如何使用C/C++語言來完成這樣的功能,下面這篇文章主要給大家介紹了關(guān)于C++日期類計算器的模擬實(shí)現(xiàn),需要的朋友可以參考下
    2023-04-04
  • C語言練習(xí)之掃雷小游戲

    C語言練習(xí)之掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言練習(xí)之掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 關(guān)于C++中strcpy函數(shù)例題講解

    關(guān)于C++中strcpy函數(shù)例題講解

    在本篇文章里小編給大家整理的是關(guān)于C++中strcpy函數(shù)例題講解內(nèi)容,需要的朋友們可以參考下。
    2020-05-05
  • Linux下semop等待信號時出現(xiàn)Interrupted System Call錯誤(EINTR)解決方法

    Linux下semop等待信號時出現(xiàn)Interrupted System Call錯誤(EINTR)解決方法

    本篇文章是對在Linux下semop等待信號時出現(xiàn)Interrupted System Call錯誤(EINTR)的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++ Boost Array與Unordered使用介紹

    C++ Boost Array與Unordered使用介紹

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • VC++中HTControl的CHTButton按鈕控件類用法實(shí)例解析

    VC++中HTControl的CHTButton按鈕控件類用法實(shí)例解析

    這篇文章主要介紹了VC++中HTControl的CHTButton按鈕控件類用法,對于大家進(jìn)行VC++項目開發(fā)有一定的幫助作用,需要的朋友可以參考下
    2014-08-08

最新評論