C字串操作strcat strcat s詳解

2021-09-23 18:13:02 字數 3421 閱讀 3135

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

把src所指字串新增到dest結尾處(覆蓋dest結尾處的'\0')並新增'\0'

標頭檔案:

#include(c)  、 #include

宣告:char *strcat(char *dest, const char *src)

引數:dest -- 指向目標字串,該陣列包含了乙個 c 字串,且足夠容納追加後的字串

src  -- 指向要追加的字串,該字串不會覆蓋目標的字串

返回值:指向dest的指標

(1)src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。最重要的是,strcat函式不檢查這些。

(2)strcat返回值有什麼作用? 鏈式傳遞:strcat(a, strcat(b, c));

#include "stdafx.h"

#include #include int main()

顯示結果:

錯誤    1    error c4996: 'strcat': this function or variable may be unsafe. consider using strcat_s instead. to disable deprecation, use _crt_secure_no_warnings. see online help for details. 

正如前言裡說的,微軟已經知道strcat等函式不安全了,直接不讓你通過了,而解決措施也告訴我們了。但是這裡為了先看看strcat,所以先不用strcat_s。

如何忽略這個警告/錯誤,措施有以下幾種:

(1)第一種:_crt_secure_no_warnings

vs中:專案 - 屬性 - 配置 - c/c++ - 預處理器 - 預處理器定義裡新增:_crt_secure_no_warnings

(2)第二種: 加個預處理命令:#pragma warning(disable:4996)

#include "stdafx.h"

#include #include #pragma warning(disable:4996)

int main()

結果顯示:

str1 is hello,world

str2 is world

請按任意鍵繼續. . .

ps:這裡如果要用strcat,我還是傾向於第二種方法,因為第一種方法久而久之我們自己給忘了,而第二種方法從程式裡就能顯而易見,從而提醒自己這是個不安全的函式。

前面也說,strcat函式有兩個條件,dest的空間要能容納src,且兩者記憶體不能重疊。

下面分別看下不滿足上述兩個條件,會發生什麼。

(1)dest空間不足

從結果可以看出:當dest空間不足時,編譯是可以通過的,但是在執行時出錯。

(2)dest和src記憶體重疊

#include "stdafx.h"

#include #include #pragma warning(disable:4996)

int main()

結果:可以編譯,但是無輸出。

strcat小結:

不安全函式,全靠程式設計者自己注意。這種函式平常練習為了方便用用,真正寫**的時候還是不要用這種函式,東西多了腦子可能就忽視了。

(1)用strcat_s函式

1 函式宣告:(引用msdn)

errno_t strcat_s(char *strdestination, size_t numberofelements, const char *strsource);

2 引數及返回值

引數:

strdestination -- 目標字串緩衝區

numberofelements -- 源字串追加到目標字串緩衝區後的總大小,單位位元組

strsource -- 源字串緩衝區 

返回值:

0:成功

einval:目標字串或者源字串沒有初始化

erange:越界

3 注意

strcat_s函式從上面可以看出,做了兩個檢查,字串有沒有初始化和越界。並沒有針對記憶體重疊做出檢查。

第乙個引數:合併字串後的大小。即 源字串大小 + 目標字串的大小 + '\0'的大小 ,也就是

numberofelements = strlen(strdestination) + strlen(strsource) + 1;

4 **演示

#include "stdafx.h"

#include #include int main()

但是結果並不是:dest's size is small!

除錯的時候,發現rlt=0,而msdn上著名返回值為0即成功。

這個地方我是真的百思不得其解啊!哪位大佬看到了這篇部落格,有想法請一定告訴我! 謝謝!

(2)用c++的string函式

#include "stdafx.h"

#include #include int main()

輸出結果:

hello,world

請按任意鍵繼續. . .

用c++中的string類簡單粗暴。

但是要注意以下幾點

(1)當把string物件和字元字面值及字串字面值混在一條語句中使用時,必須確保每個加法運算子的兩側的運算物件至少有乙個是string。參考<>第5版,p81

(2)string 怎麼轉 char* ?

char *str = const_cast(rlt.c_str());

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...