C語言中strlen方法的陷阱

2021-08-26 18:47:40 字數 765 閱讀 3344

在用strlen時遇到挺鬱悶的問題,用strlen求字元陣列的長度時總是不對,google了一下才發現忽略了其中的一些細節。

int main()

在我的機器上執行結果總是26,但明顯應該是5,why?看了下strlen的原始碼才明白,strlen判斷字串長度時是以'\0'為界的,也即strlen碰到'\0'時才會認為字串結束了。

我們知道,字串常量是以'\0'為結尾的,而上面將字串常量「aabcd」賦給a陣列時,恰恰丟掉了結尾的'\0',以至於判斷到'd'的下一位發現不是'\0'進而繼續判斷。所以,在判斷字串常量時是不會出錯的,若非要判斷字元陣列的長度,就需要注意了。

這其中還有乙個陷阱,看下面的語句:

int main() 

在我機器上的執行結果如下:

5

-24294967294d

01

可能在最後的兩個結果有疑問,這種邏輯放在平常感覺沒什麼不一樣,這裡為什麼會不一致呢?看一下strlen的原型也就明白了

size_t strlen(const char *string);

其中在string.h中說明了size_t是在stddef.h中定義的。我機器的stddef.h中定義size_t為無符號整型,而無符號與有符號的運算結果還是無符號的。這也就解釋了為什麼最後乙個結果判斷為真,因為-2的無符號整型值大於0。

C語言中的技術陷阱

c語言深入學習階段,我正在讀 c語言程式設計之道 這本書,整理了c語言中的一些技術陷阱。這本書上的封面上有一句話我覺得挺有道理 每多學一點知識,就少寫一行 知識便是財富。一 c語言中的識別符號是區分大小寫的 這是很基本的問題,初學者也很容易忽視。二 與 的混淆使用 例如 int main 本想定義二...

C 語言中 struct 的陷阱

假設我們要為某大學寫乙個工資管理程式。首先是表示員工的 employee 類 employee.cs 01 namespace skyiv.ben 02 06 public string name 07 public decimal salary 08 09 public employee stri...

C 語言中 struct 的陷阱

假設我們要為某大學寫乙個工資管理程式。首先是表示員工的 employee 類 employee.cs 01 namespace skyiv.ben 02 06 public string name 07 public decimal salary 08 09 public employee stri...