C字串操作strlen strnlen s詳解

2021-09-23 18:46:07 字數 3488 閱讀 7648

strcat、strcpy、strcmp、strlen是c中針對字串的庫函式,這四個函式不安全,然後c針對這個情況整出strcat_s、strcpy_s、strncmp、strnlen_s(這個並不是替代stelen的)來彌補。

計算指定字串的長度,但不包括結束字元。

標頭檔案:

#include(c)  、 #include

宣告:size_t strlen(char const *str);

引數:str -- 要計算的字串

返回值:字串長度,size_t是unsigned int

(1)strlen計算時,一定要確保字元陣列是以空字元結束的,如果沒有則可能沿著陣列在記憶體中的位置不斷向前尋找,知道遇到空字元才停下來。

(2)當字串為nullptr時,strlen行為未定義。

(1)字串串結尾有空字元

#include "stdafx.h"

#include #include int main()

結果輸出:

length is 11

請按任意鍵繼續. . .

(2)字串結尾無空字元結尾

#include "stdafx.h"

#include #include int main();

size_t len = strlen(str);

std::cout << "length is " << len << std::endl;

return 0;

}結果輸出:

length is 23

請按任意鍵繼續. . .

很明顯,當字串結尾無空字元時,結果未定義。

strnlen這個函式一般用於檢測不可信的資料(如網路資料),因為這種資料中可能沒有'\0',這時如果用strlen的話會一直掃瞄無法停止(直到越界觸碰到無效記憶體),而strnlen限制住了掃瞄範圍所以不會出事。

標頭檔案:

#include(c)  、 #include

宣告:size_t strnlen(const char *str, size_t numberofelements);

引數:str -- 要計算的字串

numberofelements -- 最大數量的字元進行檢查

返回值:字串長度,size_t是unsigned int

(1)如果在剛開始的numberofelements長度裡找到不到空字元,則返回numberofelements。

(2)如果字串長度小於numberofelements,且字串結尾有空字元則返回字串長度,如果結尾沒有空字元,則返回numberofelements。

(3)字串為nullptr時,返回為0。

(1)如果在剛開始的numberofelements長度裡找到不到空字元,則返回numberofelements

#include "stdafx.h"

#include #include int main()

結果輸出:

length is 5

請按任意鍵繼續. . .

(2)字串實際長度小於numberofelements,結尾有空字元和無空字元的情況

#include "stdafx.h"

#include #include int main();

size_t len = strnlen_s(str, 5);

std::cout << "length is " << len << std::endl;

return 0;

}結果輸出:

length is 4

請按任意鍵繼續. . .

int main();

size_t len = strnlen_s(str, 5);

std::cout << "length is " << len << std::endl;

return 0;

}結果輸出:

length is 5

請按任意鍵繼續. . .

(3)字串為nullptr

#include "stdafx.h"

#include #include int main()

結果輸出:

length is 0

請按任意鍵繼續. . .

綜上所述,strlen函式不安全,雖然引進了strnlen_s函式,但這個函式並不是為了替代strlen。而且兩者都有同樣的缺陷。

c++中string類中有計算字串長度的函式size()和length()

注意:char* 轉成 string時,如果char*沒有空字元,則會造成未定義行為。

#include "stdafx.h"

#include #include int main()

結果輸出為:

length is 11

請按任意鍵繼續. . .

// 未定義行為

int main();

size_t len = std::string(str).length();;

std::cout << "length is " << len << std::endl;

return 0;

}結果輸出為:

length is 29

請按任意鍵繼續. . .

如果用直接初始化string物件會發生什麼?

#include "stdafx.h"

#include #include #include int main();

std::string str2 = "hello,world";

std::string str3 = ;

size_t len1 = std::string(str1).size();

size_t len2 = std::string(str2).size();

size_t len3 = std::string(str3).size();

std::cout << "str1's length is " << len1 << std::endl;

std::cout << "str2's length is " << len2 << std::endl;

std::cout << "str3's length is " << len3 << std::endl;

return 0;

}str1's length is 11

str2's length is 11

str3's length is 12

請按任意鍵繼續. . .

從以上程式可以看出:

(1)對於字串常量,string.size()返回的時候不包含最後的空字元

(2)對於字串陣列,string.size()把'\0'當作普通字元處理。

c 字串操作

獲得漢字的區位碼 bytearray newbyte 2 求字串長度 求字串長度 int len string inputstring 檢測含有中文字串的實際長度 str為要檢測的字串 asciiencoding n new asciiencoding byte b n.getbytes str i...

C 字串操作

1.根據單個分隔字元用split擷取 例如複製 如下 string st gt123 1 string sarray st.split 即可得到sarray 0 gt123 sarray 1 1 2.利用多個字元來分隔字串 例如複製 如下 string str gtazb jiangjben 123...

C字串操作

c字串操作 注 文中的幾個大小寫不敏感比較函式,原文用的是stricmp等,後來發現linux的std庫沒有,改為strcasecmp系列。函式名 strcpy 功 能 拷貝乙個字串到另乙個字串 用 法 char strcpy char destin,char source 程式例 i nclude...