strcpy_s、sptintf_s與strcat_s的使用

strcpy_s、sptintf_s與strcat_s是strcpy、sptintf與strcat的安全版本,均是通過指定緩沖區長度來避免存在的溢出風險。

strcpy_s 與strcpy

strcpy_s和strcpy函數的功能幾乎是一樣的。strcpy函數,就象gets函數一樣,它沒有方法來保證有效的緩沖區尺寸,所以它只能假定緩沖足夠大來容納要拷貝的字符串。在程序運行時,這將導致不可預料的行為。用strcpy_s就可以避免這些不可預料的行為。

這個函數用兩個參數、三個參數都可以,只要可以保證緩沖區大小。
三個參數時:
? ? ? ? ? ? ? ? ? ? ? ? errno_t strcpy_s(char *strDestination,size_t numberOfElements,const char *strSource);
兩個參數時:
? ? ? ? ? ? ? ? ? ? ? ?errno_t strcpy_s(char(&strDestination)[size],const char *strSource); // C++ only
例子:

#include<iostream>
#include<cstring>
using namespace std;void Test(void)
{char *str1 = NULL;str1 = new char[20];char str[7];strcpy_s(str1, 20, "hello world");//三個參數strcpy_s(str, "hello");//兩個參數但如果:char *str=new char[7];會出錯:提示不支持兩個參數cout << "strlen(str1):" << strlen(str1) << endl << "strlen(str):" << strlen(str) << endl;printf(str1);printf("\n");cout << str << endl;
}int main()
{Test();return 0;
}
結果:

strlen(str1):11
strlen(str):5
hello world
hello
請按任意鍵繼續. . .

sptintf_s與sptintf

sprintf
定義:
int sprintf( char *buffer, const char *format [, argument] ... );
常見用法

//把整數123 打印成一個字符串保存在s 中。
sprintf(s, "%d", 123); //產生"123"
可以指定寬度,不足的左邊補空格:
sprintf(s, "%8d%8d", 123, 4567); //產生:" 123 4567"
當然也可以左對齊:
sprintf(s, "%-8d%8d", 123, 4567); //產生:"123 4567"
也可以按照16 進制打印:
sprintf(s, "%8x", 4567); //小寫16 進制,寬度占8 個位置,右對齊
sprintf(s, "%-8X", 4568); //大寫16 進制,寬度占8 個位置,左對齊


sprintf_s
int sprintf_s( char *buffer, size_t sizeOfBuffer, const char *format [, argument] ... );

#include<iostream>
#include<cstring>
using namespace std;int main()
{char filename[1024];//需要預先分配緩沖區char path1[128] = "D:\\Program\\Tesseract-OCR\\tesseract.exe";char path2[128] = "D:\\Program\\Tesseract-OCR\\";char path3[128] = "D:\\Program\\Tesseract-OCR\\txt";char path4[128] = "-l chi_sim";sprintf_s(filename,sizeof(filename), "%s %s %s %s", path1, path2, path3, path4);cout << filename;return 0;
}

strcat_s與strcat

? ? ? ? 原形:

? ? ? ? ? ? ? errno_t strcat_s(char *strDestination,size_t numberOfElements,constchar *strSource);
? ? ? ? ? ? ? ? extern char *strcat(char *dest,char *src);

strDestination要為strSource留下足夠的內存,具體為:

假設strDestination為一個數組的話,

sizeof(strDestination)>=sizeof(strSource)+strlen(strDestination);

numberOfElements=sizeof(strDestination)

舉例說明二者的區別:

char szBuf[3] = {0};
? ? ? ?strcat_s(szBuf, 3, "kdfdfj"); // 第一種連接字符串方法
? ? ? ?strcat(szBuf, "kdfdfj"); // 第二種連接字符串方法
? ? ? 對于這兩個例句,你仔細看就會發現他們有緩沖區溢出的問題.
? ? ? ? 而用第一個函數則不同,它會拋出一個異常。
? ? ? ? ?但使用第二個函數的結果則不能確定,因為它可能會錯誤地改變了程序中其他部分的內存的數據,有可能不會拋出異常,但 ? ? ? ? 會導致程序數據錯誤,也可能由于非法內存訪問拋出異常
使用規范:
??char string[20]="123";
?strcat_s(string,sizeof(string),"456");
?printf("%s",string);這樣20個元素,足夠裝下123456了。
注:以上三個安全函數取緩沖大小numberOfElements時,都可以取成前面那個strDestination的字節大小。
另外我們要注意strDestination到底是指針還是數組,注意二者sizeof的區別,可以混上strlen一起使用。
參考例子:《自定義String》
?





本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259068.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259068.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259068.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小米一鍵上鎖工具_小米首款高端全自動智能鎖火熱預售中,一觸開啟全自動時代...

近些年&#xff0c;隨著科技的發展&#xff0c;人工智能逐漸走入大眾視野。人類社會也正從信息時代向“智能時代”過渡&#xff0c;在整個過程中智能家居領域的蓬勃發展可謂當仁不讓&#xff0c;一直備受用戶矚目。智能鎖作為家的第一道守護防線&#xff0c;家庭物聯網入口的關…

Eigen+suitesparse for windows 安裝

Eigen是著名的C矩陣運算庫&#xff0c;提供了許多矩陣運算的接口&#xff0c;主要包括兩大部分&#xff0c;一部分是稠密矩陣&#xff0c;另一部分是稀疏矩陣。Eigen以源碼形式提供給大家&#xff0c;用的時候&#xff0c;只要將源碼包含在項目的包含路徑上&#xff0c;具體安裝…

軟件盤控制的問題

2019獨角獸企業重金招聘Python工程師標準>>> 在全屏模式或者是沉寢室標題欄 方案一&#xff1a;全屏模式 1.軟鍵盤被EditText遮擋住了&#xff0c;如果說EditText被嵌套在有滑動的視圖中,采取的方式是: activity中設置此屬性 android:windowSoftInputMode"…

python語言學習零基礎教學視頻_Python告白小白視頻教程(零基礎入門)

1 Python編程基礎入門篇通過本次課程的學習&#xff0c;我們每個人都可以進入python世界里&#xff0c;從簡單到高級&#xff0c;讓人人都能學會python&#xff0c;我們在學習的時候&#xff0c;python讓我們的運維變得更有樂趣&#xff0c;讓我們的運維更加的高大上&#xff0…

SQL 快速入門2.1

MySQL top&#xff08;MySQL limit&#xff09;語法 SELECT column_name(s) FROM table_name LIMIT number 例子 SELECT * FROM Persons LIMIT 5 SQL LIKE 操作符 SQL LIKE 操作符語法 SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern 原始的表 (用在例…

sencha touch 入門系列 (一)sencha touch 簡介

參考鏈接:http://mobile.51cto.com/others-278381.htm Sencha touch 是基于JavaScript編寫的Ajax框架ExtJS,將現有的ExtJS整合JQTouch、Rapha&euml;l庫&#xff0c;推出適用于最前沿Touch Web的移動應用開發框架&#xff0c;該框架是世界上第一個 基于HTML5的Mobile App框架…

求二叉樹的深度和寬度

// 求二叉樹的深度和寬度.cpp : 定義控制臺應用程序的入口點。 <pre name"code" class"cpp">#include <iostream> #include <queue> using namespace std;struct BTNode {char m_value;BTNode *m_left;BTNode *m_right; };//先序創建二叉…

漢堡包

在我們結對的這些天里&#xff0c;我清晰的感受到同伴對我的幫助&#xff0c;每當我有不懂的時候她都會積極的幫助我&#xff0c;也會聽取我的意見積極配合我&#xff0c;在我懶惰的時候也能夠提醒督促我&#xff0c;我想這些只有結對時才能體會到。我們都知道&#xff0c;結對…

zabbix自動發現監控磁盤(iops和讀寫量)

2019獨角獸企業重金招聘Python工程師標準>>> 對于磁盤有個iops的概念比較奇怪&#xff0c;想監控起來看下&#xff0c;利用zabbix的自動發現把每個磁盤的iops監控起來&#xff0c;思路&#xff1a;自動發現所有的磁盤&#xff0c;然后監控各個磁盤的iops。效果如下圖…

一個表單同時向兩個頁面傳值

現在有一個表單<form action"AddNewstu.asp" METHOD"POST" ><INPUT TYPE "Text" NAME "name" SIZE "20"><BR></FORM>此表單向AddNewstu.asp頁面傳入了一個name的值&#xff0c;如果同時把name…

matlab內置函數fitgeotrans與transformPointsForward解析

最近研究3000fps的實現&#xff0c;看了網上給的一個matlab代碼&#xff0c;里面有提到init_shape到mean_shape的對齊&#xff0c;里面使用了fitgeotrans和transformPointsForward兩個函數。于是參考matlab help研究了一下這兩個函數. fitgeotrans函數 語法: tform fitgeotr…

【電腦使用經驗】怎么查看無線網絡中電腦的IP地址?

1、 2、 3、 4、 5、 轉載于:https://www.cnblogs.com/happykoukou/p/4437111.html

win8硬盤安裝Ubuntu14.04雙系統參考教程

硬盤安裝&#xff0c;無需光盤、U盤。win8為主。Ubuntu14.04為輔。可將Windows或Ubuntu設置為開機默認啟動項。在Ubuntu下可查看、操作Windows系統下的文件&#xff1b;適用于安裝和14.04版本號相近的Ubuntu系統。假設以上所述正是你所須要的。那么這可能是一篇您值得參考的教程…

oracle nvarchar2,varchar2,char,nchar說明

char(size)&#xff1a; 數據長度為size&#xff0c;不足的用空格補&#xff0c;超出后報錯。char類型的數據最大長度是2000字節或字符&#xff0c;每個字符長度依賴于數據庫字符集&#xff0c;數據按字符存儲還是字節存儲取決于nls_length_semantics參數。如果每個字符占兩個字…

散列表查找失敗平均查找長度_Python數據結構與算法56:排序與查找:沖突解決方案...

注&#xff1a;本文如涉及到代碼&#xff0c;均經過Python 3.7實際運行檢驗&#xff0c;保證其嚴謹性。本文閱讀時間約為6分鐘。前面說過&#xff0c;如果兩個數據項被散列映射到同一個槽&#xff0c;需要一個系統化的方法在散列表中保存第二個數據項&#xff0c;這個過程被稱為…

Face Alignment by 3000 FPS系列學習總結(一)

廣播&#xff1a; 如今的opencv已經提供了LBF的訓練和測試代碼&#xff0c;推薦閱讀 《使用OpenCV實現人臉關鍵點檢測》 face alignment 流程圖 train階段 測試階段 預處理 裁剪圖片 tr_data loadsamples(imgpathlistfile, 2); 說明&#xff1a; 本函數用于將原始圖片取…

acm常見算法及例題

1 acm常見算法及例題2 3 初期:4 一.基本算法:5 (1)枚舉. (poj1753,poj2965)6 (2)貪心(poj1328,poj2109,poj2586)7 (3)遞歸和分治法.8 (4)遞推.9 (5)構造法.(poj3295)10 (6)模擬法.(poj1068,poj2632,poj1573,poj2993,poj2996)11 二.圖算法…

2爬蟲基礎了解

1.什么是爬蟲爬蟲&#xff0c;即網絡爬蟲&#xff0c;大家可以理解為在網絡上爬行的一直蜘蛛&#xff0c;互聯網就比作一張大網&#xff0c;而爬蟲便是在這張網上爬來爬去的蜘蛛咯&#xff0c;如果它遇到資源&#xff0c;那么它就會抓取下來。想抓取什么&#xff1f;這個由你來…

js(function(){alert(‘’‘)})

function(){alert(sss)}是個匿名函數。沒有名字。所以沒有辦法調用。在外面加個括號&#xff0c;就變成了一個值&#xff0c;值的內容是函數的引用。例如var a (function(){"nop"})a 就是對這個函數的引用。有了名字&#xff0c;之后可以調用&#xff0c;例如a()現在…

macbook 移動硬盤無法寫入_如何升級MacBook筆記本的SSD硬盤-菜鳥折騰系列一

2010 年的時候買了 09 年末的 MACBOOK 小白&#xff0c;由于技術發展&#xff0c;軟件越來越吃硬件內存&#xff0c;現在2G 內存別提基本的工作了&#xff0c;連開機都有困難&#xff0c;每次一點就一個風火輪&#xff0c;基本就是一塊 13 寸的板磚了。。。眾所周知 HDD 機械硬…