strcat、strcpy、strcmp、strlen是c中針對字串的庫函式,這四個函式不安全,然後c針對這個情況整出strcat_s、strcpy_s、strncmp、strnlen_s(這個並不是替代stelen的)來彌補。
計算指定字串的長度,但不包括結束字元。
標頭檔案:(1)strlen計算時,一定要確保字元陣列是以空字元結束的,如果沒有則可能沿著陣列在記憶體中的位置不斷向前尋找,知道遇到空字元才停下來。#include(c) 、 #include
宣告:size_t strlen(char const *str);
引數:str -- 要計算的字串
返回值:字串長度,size_t是unsigned int
(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限制住了掃瞄範圍所以不會出事。
標頭檔案:(1)如果在剛開始的numberofelements長度裡找到不到空字元,則返回numberofelements。#include(c) 、 #include
宣告:size_t strnlen(const char *str, size_t numberofelements);
引數:str -- 要計算的字串
numberofelements -- 最大數量的字元進行檢查
返回值:字串長度,size_t是unsigned int
(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...