strcat、strcpy、strcmp、strlen是c中針對字串的庫函式,這四個函式不安全,然後c針對這個情況整出strcat_s、strcpy_s、strncmp、strnlen_s(這個並不是替代stelen的)來彌補。而在c++中一般用string。
把src所指字串新增到dest結尾處(覆蓋dest結尾處的'\0')並新增'\0'
標頭檔案:(1)src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。最重要的是,strcat函式不檢查這些。#include(c) 、 #include
宣告:char *strcat(char *dest, const char *src)
引數:dest -- 指向目標字串,該陣列包含了乙個 c 字串,且足夠容納追加後的字串
src -- 指向要追加的字串,該字串不會覆蓋目標的字串
返回值:指向dest的指標
(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 引數及返回值
引數:3 注意strdestination -- 目標字串緩衝區
numberofelements -- 源字串追加到目標字串緩衝區後的總大小,單位位元組
strsource -- 源字串緩衝區
返回值:
0:成功
einval:目標字串或者源字串沒有初始化
erange:越界
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...