C string中的幾個小陷阱,你掉進過嗎?

2021-06-27 19:30:29 字數 1360 閱讀 1494

c++開發的專案難免會用到stl的string,使用管理都比char陣列(指標)方便的多,但在得心應手的使用過程中也要警惕幾個小陷阱,避免我們專案出bug卻遲遲找不到原因。

直接通過乙個例子說明,下面的例子會輸出什麼:

[cpp]view plain

copy

#include 

#include 

#include 

using

namespace

std;  

struct

flowrecord            

;  int

main()   

c_str()函式用於string與const char*之間的轉換,也經常能用到,下面的例子你說輸出啥?

[cpp]view plain

copy

#include 

#include 

using

namespace

std;  

intmain()   

嗯,第乙個不用多說,第二個輸出是「alexia」還是「amexia」呢?答案是後者,咋一看const char*的值應該是個常量啊,怎麼還能改變值呢?哈,又是個經典的面試題:const char*, char const*, char* const的區別

是什麼?老生常談的問題,const char*與char const*是等價的,指的是指向字元常量的指標,即指標可以改變指向但其指向的內容不可以改變,而char* const相反,指的是常量指標,即指向不可以改變但指標指向的內容可以改變。因此這裡的const char*指向的內容本類是不可以改變的,那麼這裡為什麼改變了呢?這跟str這個const char*的生命週期及string類的實現有關,string的c_str()返回的指標是由string管理的,因此它的生命期是string物件的生命期,而string類的實現實際上封裝著乙個char*的指標,而c_str()直接返回該指標的引用,因此string物件的改變會直接影響

已經執行過的c_str()

返回的指標引用。

3. 字串字面值與標準庫string不是同一種型別

直接看下面的例子:

[cpp]view plain

copy

string s(

"hello"

);  

cout/ok

cout<

.size()/error

cout

/okcout<

+"world"

/error

可以看出兩者是非常不同的,不能混淆使用。

C string中的幾個小陷阱,你掉進過嗎?

c 開發的專案難免會用到stl的string,使用管理都比char陣列 指標 方便的多,但在得心應手的使用過程中也要警惕幾個小陷阱,避免我們專案出bug卻遲遲找不到原因。直接通過乙個例子說明,下面的例子會輸出什麼 include include include using namespace std...

幾個笑死你的小笑話

衛生 廚房 餐後,一位顧客把飯店老闆叫了來。先生,祝賀您!您這兒的廚房很衛生啊!多謝,先生 我盡力而為。但是,我請教,您不曾參觀過我 的廚房怎麼會誇這裡很衛生呢?噢,很簡單。我剛在這兒吃的一切都有一股肥皂味。小 費 一位先生在餐館吃完飯,結帳後準備起身離去。站在一旁的侍 者見他無意付小費,忙說 先生...

Go Slice 使用中的小陷阱

go中的切片有兩個特性 type slice struct包括從切片和陣列派生出來的切片都是公用乙個底層陣列的 make構造出來的切片,已經預先填充了len個零值元素了。總而言之,對切片的更改都會影響到底層的陣列結構,因此需要慎重。動手做個實驗 package main import fmt fun...