国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C語言】scanf和strcpy這類關(guān)鍵字和函數(shù)為什么不安全,使用VS編譯會(huì)報(bào)錯(cuò)

這篇具有很好參考價(jià)值的文章主要介紹了【C語言】scanf和strcpy這類關(guān)鍵字和函數(shù)為什么不安全,使用VS編譯會(huì)報(bào)錯(cuò)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

首先先說解決方法:

在程序最頂端加入這個(gè)代碼段

#define??_CRT_SECURE_NO_WARNINGS

這主要是微軟的 C 運(yùn)行時(shí)庫(kù)實(shí)現(xiàn)將這些函數(shù)標(biāo)記為不安全,主要原因是這些函數(shù)缺乏對(duì)輸入長(zhǎng)度的邊界檢查,容易導(dǎo)致緩沖區(qū)溢出漏洞。

會(huì)產(chǎn)生這樣的報(bào)錯(cuò):

strcpy安全問題,C語言,安全,c++

即:

C4996?? ?'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.?

下面是關(guān)于`scanf`和`strcpy`為什么可能不安全的一些主要原因:

1. 緩沖區(qū)溢出:`scanf`和`strcpy`函數(shù)不對(duì)輸入進(jìn)行邊界檢查,導(dǎo)致可能發(fā)生緩沖區(qū)溢出。這意味著當(dāng)輸入的字符串長(zhǎng)度超過目標(biāo)緩沖區(qū)的容量時(shí),會(huì)覆蓋相鄰內(nèi)存空間的數(shù)據(jù)。攻擊者可以利用這種漏洞來執(zhí)行惡意代碼或者修改程序的行為。

2. 字符串終止符`\0`處理問題:`strcpy`函數(shù)在拷貝字符串時(shí),需要確保目標(biāo)緩沖區(qū)具有足夠的空間來容納源字符串,以及在目標(biāo)緩沖區(qū)的末尾添加字符串終止符`\0`。如果源字符串比目標(biāo)緩沖區(qū)大,或者忘記添加`\0`,會(huì)導(dǎo)致緩沖區(qū)溢出或未定義的行為。

3. 無法處理特殊字符:`scanf`函數(shù)對(duì)于輸入中的特殊字符(例如空格、制表符等)的處理不夠靈活。默認(rèn)情況下,`scanf`會(huì)將這些特殊字符視為輸入結(jié)束的標(biāo)志,因此可能無法正確讀取包含特殊字符的字符串。

4. 難以追蹤和調(diào)試:由于不安全的函數(shù)和關(guān)鍵字使用不依賴于輸入的長(zhǎng)度,因此很難在運(yùn)行時(shí)捕獲和排查相關(guān)問題。這可能導(dǎo)致程序的脆弱性更加難以發(fā)現(xiàn)和修復(fù)。

為微軟官方給出的建議是,可以考慮使用更安全的替代函數(shù)和關(guān)鍵字,如`fgets`、`strncpy`等,但是其實(shí)也并不見得安全,同樣存在問題,需要結(jié)合適當(dāng)?shù)妮斎腧?yàn)證和邊界檢查來確保程序的安全性。

下面介紹一下這些替代的函數(shù)怎么用:

1. 使用 `fgets` 讀取用戶輸入:

fgets?函數(shù)有三個(gè)參數(shù),它們的含義分別是:

  1. 目標(biāo)緩沖區(qū):fgets?函數(shù)將從輸入流中讀取的數(shù)據(jù)存儲(chǔ)在目標(biāo)緩沖區(qū)中。這是一個(gè)指向字符數(shù)組的指針,用于接收輸入的字符串?dāng)?shù)據(jù)。

  2. 緩沖區(qū)大?。哼@個(gè)參數(shù)指定了目標(biāo)緩沖區(qū)的大?。ㄒ宰止?jié)數(shù)表示)。fgets?函數(shù)將最多讀取?size-1?個(gè)字符到目標(biāo)緩沖區(qū)中,這是為了為字符串終止符?\0?預(yù)留空間。

  3. 輸入流:這個(gè)參數(shù)指定了要從哪個(gè)輸入流中讀取數(shù)據(jù)。通常是標(biāo)準(zhǔn)輸入流?stdin,表示從鍵盤讀取用戶輸入。你也可以指定其他的輸入流,如從文件中讀取。

#include <stdio.h>

int main() {
? ? char input[100]; // 假設(shè)緩沖區(qū)大小為 100

? ? printf("請(qǐng)輸入字符串: ");
? ? fgets(input, sizeof(input), stdin); // 從標(biāo)準(zhǔn)輸入讀取字符串,最多讀取 sizeof(input)-1 個(gè)字符

? ? printf("輸入的字符串是: %s\n", input);

? ? return 0;
}

`fgets` 函數(shù)讀取一行輸入,包括空格,將其存儲(chǔ)在目標(biāo)緩沖區(qū) `input` 中(讀取的最大字符數(shù)為 `sizeof(input)-1`)。`input` 的大小減去 1 是為了讓函數(shù)有足夠的空間在最后添加字符串終止符 '\0'。

2. 使用 `strncpy` 復(fù)制字符串到目標(biāo)緩沖區(qū):

strncpy?函數(shù)有三個(gè)參數(shù),它們的含義分別是:

  1. 目標(biāo)字符串:這是一個(gè)指向字符數(shù)組的指針,用于存儲(chǔ)復(fù)制后的字符串。

  2. 源字符串:這是一個(gè)指向字符數(shù)組的指針,表示要復(fù)制的原始字符串。

  3. 復(fù)制的字符數(shù):這個(gè)參數(shù)表示要復(fù)制的字符數(shù),即將源字符串中的多少個(gè)字符復(fù)制到目標(biāo)字符串中。

#include <stdio.h>
#include <string.h>

int main() {
? ? char source[10] = "Hello"; // 源字符串
? ? char destination[20]; // 目標(biāo)緩沖區(qū)

? ? strncpy(destination, source, sizeof(destination)-1); // 復(fù)制 source 到 destination,最多復(fù)制 sizeof(destination)-1 個(gè)字符
? ? destination[sizeof(destination)-1] = '\0'; // 手動(dòng)添加字符串終止符 '\0'

? ? printf("目標(biāo)緩沖區(qū)中的字符串是: %s\n", destination);

? ? return 0;
}

`strncpy` 函數(shù)將源字符串 `source` 復(fù)制到目標(biāo)緩沖區(qū) `destination` 中,最多復(fù)制 `sizeof(destination)-1` 個(gè)字符。需要注意的是,`strncpy` 不會(huì)自動(dòng)添加字符串終止符 '\0',因此需要手動(dòng)在目標(biāo)緩沖區(qū)末尾添加。

3.使用 `memcpy` 將一段內(nèi)存的內(nèi)容復(fù)制到另一段內(nèi)存中的示例:

“Memory Copy”,即內(nèi)存拷貝,memcpy?函數(shù)有三個(gè)參數(shù),它們的含義分別是:

  1. 目標(biāo)指針:這是一個(gè)指向目標(biāo)內(nèi)存區(qū)域的指針,用于存儲(chǔ)復(fù)制后的數(shù)據(jù)。

  2. 源指針:這是一個(gè)指向源內(nèi)存區(qū)域的指針,表示要復(fù)制的原始數(shù)據(jù)。

  3. 復(fù)制的字節(jié)數(shù):這個(gè)參數(shù)表示要復(fù)制的字節(jié)數(shù),即將源內(nèi)存區(qū)域中的多少個(gè)字節(jié)復(fù)制到目標(biāo)內(nèi)存區(qū)域中。

#include <stdio.h>
#include <string.h>

int main() {
? ? char source[10] = "Hello"; // 源內(nèi)存
? ? char destination[20]; // 目標(biāo)內(nèi)存

? ? memcpy(destination, source, strlen(source) + 1); // 將 source 復(fù)制到 destination

? ? printf("目標(biāo)內(nèi)存中的內(nèi)容是: %s\n", destination);

? ? return 0;
}

在上面的示例中,`memcpy` 函數(shù)將源內(nèi)存 `source` 復(fù)制到目標(biāo)內(nèi)存 `destination` 中,并且 `strlen(source) + 1` 是要復(fù)制的字節(jié)數(shù),包括字符串結(jié)尾的空字符 '\0'。文章來源地址http://www.zghlxwxcb.cn/news/detail-629568.html

到了這里,關(guān)于【C語言】scanf和strcpy這類關(guān)鍵字和函數(shù)為什么不安全,使用VS編譯會(huì)報(bào)錯(cuò)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C++】:函數(shù)重載,引用,內(nèi)聯(lián)函數(shù),auto關(guān)鍵字,基于范圍的for循環(huán),nullptr關(guān)鍵字

    【C++】:函數(shù)重載,引用,內(nèi)聯(lián)函數(shù),auto關(guān)鍵字,基于范圍的for循環(huán),nullptr關(guān)鍵字

    在C語言中,同名函數(shù)是不能出現(xiàn)在同一作用域的,但是在C++中卻可以,但是要滿足函數(shù)重載的規(guī)則。 那什么是函數(shù)重載呢?它的規(guī)則是什么呢? 函數(shù)重載 :是函數(shù)的一種特殊情況,C++允許在 同一作用域 中聲明幾個(gè)功能類似的 同名函數(shù) ,這些同名函數(shù)的 形參列表(參數(shù)個(gè)數(shù)

    2024年04月26日
    瀏覽(25)
  • 【C++】關(guān)鍵字 & 命名空間 & 輸入輸出 & 缺省函數(shù)

    【C++】關(guān)鍵字 & 命名空間 & 輸入輸出 & 缺省函數(shù)

    C++? 總計(jì) 63 個(gè), C語言 32 個(gè) 直接上圖:? asm do if return try continue auto double inline short typedef for bool dynamic_cast int signed typeid public break else long sizeof typename throw case enum mutable static union wchar_t catch explicit namespace static_cast unsigned default char export new struct using friend class ext

    2024年02月08日
    瀏覽(26)
  • 【C++入門】引用、內(nèi)聯(lián)函數(shù)、auto 關(guān)鍵字

    從語法上理解,引用就是給變量取一個(gè) 別名 ,它沒有獨(dú)立空間,和它引用的變量共用一塊空間。 例子: 值得注意的是,C++ 中的引用一經(jīng)初始化,后面是改變不了指向的(這點(diǎn)與Java有所不同),而且引用是必須初始化的。 引用的類型也必須和原變量對(duì)應(yīng),顯然,你肯定不能

    2024年02月16日
    瀏覽(14)
  • 【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等

    【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等

    前言:在前面我們講解了C++入門基礎(chǔ)的一些學(xué)習(xí)例如命名空間、缺省參數(shù)、函數(shù)重載等。今天我們將進(jìn)一步的學(xué)習(xí),跟著博主的腳步再次往前邁一步吧。 ?? 博主CSDN主頁:衛(wèi)衛(wèi)衛(wèi)的個(gè)人主頁 ?? ?? 專欄分類:高質(zhì)量C++學(xué)習(xí) ?? ??代碼倉(cāng)庫(kù):衛(wèi)衛(wèi)周大胖的學(xué)習(xí)日記?? ??關(guān)注博

    2024年02月20日
    瀏覽(95)
  • 【C語言】for 關(guān)鍵字

    【C語言】for 關(guān)鍵字

    ??WRITE IN FRONT????? ??介紹:\\\"謓澤\\\"正在路上朝著\\\"攻城獅\\\"方向\\\"前進(jìn)四\\\"?? ??榮譽(yù):2021|2022年度博客之星物聯(lián)網(wǎng)與嵌入式開發(fā)TOP5|TOP4、2021|2022博客之星TOP100|TOP63、阿里云專家博主、掘金優(yōu)秀創(chuàng)作者、全網(wǎng)粉絲量5w+、全網(wǎng)訪問量70w+?? ??本文章內(nèi)容由 謓澤 原創(chuàng) 如需相關(guān)轉(zhuǎn)載

    2023年04月17日
    瀏覽(43)
  • C語言volatile關(guān)鍵字

    在C語言中, volatile 是一個(gè)類型修飾符,用于告訴編譯器對(duì)象的值可能會(huì)在編譯器無法檢測(cè)到的情況下被改變。這通常發(fā)生在以下兩種情況: 硬件的輸入/輸出操作,例如一個(gè)設(shè)備寄存器的讀取或?qū)懭搿?共享內(nèi)存的并行程序,其中一個(gè)線程修改了一個(gè)內(nèi)存位置,而另一個(gè)線程

    2024年02月07日
    瀏覽(29)
  • 【C++初階(三)】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字

    【C++初階(三)】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字

    目錄 ?前言 ?1. 引用 ? 1.1 引用的概念? ?1.2 引用的特性 ?1.3 引用的權(quán)限 ?1.4 引用的使用 ?1.5 引用與指針的區(qū)別 2. 內(nèi)聯(lián)函數(shù) 2.1? 什么是內(nèi)聯(lián)函數(shù) 2.2? 內(nèi)聯(lián)函數(shù)的特性 ?3. auto ?3.1 auto簡(jiǎn)介 ?3.2 auto使用規(guī)則 ?3.3 auto不能使用的場(chǎng)景 4.? 基于范圍的for循環(huán) ?4.1 范圍for使用

    2024年02月08日
    瀏覽(36)
  • C語言-外部關(guān)鍵字extern

    C語言-外部關(guān)鍵字extern

    extern ?extern 用在全局變量或函數(shù)的聲明前,用來說明“此變量/函數(shù)是在別處定義的,要在此處引用。 ?什么是定義,什么是聲明? ? ? ? 什么是定義:所謂的定義就是為這個(gè)變量分配一塊內(nèi)存并給它取上一個(gè)名字,這個(gè)名字就是我們經(jīng)常所說的變量名。但注意,這個(gè)名

    2024年02月07日
    瀏覽(21)
  • 【C語言】static關(guān)鍵字詳解

    【C語言】static關(guān)鍵字詳解

    目錄 1.static是什么? 2.static修飾的對(duì)象是? 3.static修飾后改變了什么? 4.static修飾操作演示 (1) 局部變量 如果加了static修飾局部變量i會(huì)怎么樣? 全局區(qū)(靜態(tài)區(qū)) (2)?全局變量 如果給全局變量加上了static修飾呢? 二者區(qū)別?? 這樣用有什么用? (3)?函數(shù) 5.總結(jié)

    2024年02月10日
    瀏覽(18)
  • 【SQL】SQL的基礎(chǔ)知識(shí)-語法、關(guān)鍵字、函數(shù)

    SQL(Structured Query Language)是一種用于管理關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)的語言。在本文中,我們將討論SQL的基礎(chǔ)知識(shí),包括語法、和函數(shù)。 SQL語法由多個(gè)和操作符組成,用于完成對(duì)數(shù)據(jù)的操作。以下是SQL的基礎(chǔ)語法: 其中, SELECT 用于選擇要查詢的列,

    2024年02月06日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包