最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中字符串拷貝函數strcpy的實現與優(yōu)化指南

 更新時間:2026年05月13日 09:21:47   作者:sanqima  
本文介紹了C++中字符串拷貝函數strcpy的基本用法及常見邊界條件,分析了不同版本的實現方式及其優(yōu)缺點,并提供了測試案例和使用場景建議,強調了安全性的重要性,需要的朋友可以參考下

C++中,有個常見的字符串拷貝函數:char* strcpy(char* dst, const char* src), 作用是將1個字符串src,拷貝到另外一個字符串dst。需要考慮的邊界條件如下:

  • 空指針:dst或src為NULL時會觸發(fā)非法內存訪問。
  • 內存重疊:dst和src的地址范圍存在重疊,從前向后拷貝會覆蓋尚未讀取的src內容。
  • 空字符串:src僅包含’\0’,需保證拷貝后dst仍然是合法空串。
  • 緩沖區(qū)溢出:dst空間不足導致拷貝越界,是嚴重的安全漏洞。
  • 結束符丟失:必須保證拷貝后的dst以’\0’結尾,否則后續(xù)strlen/printf等字符串操作會越界。

1 基本版本

#include <cassert>
// 對齊標準strcpy簽名,src加const保證常量正確性
char* my_strcpy(char* dst, const char* src) {
    // 調試期斷言快速定位空指針問題,發(fā)布模式可關閉斷言不影響性能
    assert(dst != nullptr && src != nullptr);
    // 保存目標地址首指針,后續(xù)會移動dst指針
    char* ret = dst;
    // 拷貝邏輯:賦值表達式返回賦值后的值,遇到'\0'時循環(huán)終止,自動包含結束符
    while ((*dst++ = *src++) != '\0');
    return ret;
}

1.1 優(yōu)點

實現了核心功能,適合調用方能保證參數合法性的高性能場景。

1.2 缺點

  • 若發(fā)布模式關閉斷言,則傳入空指針,會觸發(fā)未定義行為。
  • 沒有處理內存重疊場景,若dst落在src的地址范圍內且dst > src,會導致拷貝內容錯誤。
  • 沒有檢查dst緩沖區(qū)大小,極易出現溢出。

2 進階版(支持內存重疊)

參考memmove的語義,處理重疊場景,特別存在地址重疊的情況(如字符串內部移動)

#include <cstddef> // size_t定義
char* my_strcpy(char* dst, const char* src) {
    // 發(fā)布期也保留空指針檢查,避免程序崩潰
    if (dst == nullptr || src == nullptr) {
        return nullptr;
    }
    char* ret = dst;
    // 第一步:計算src總長度(包括末尾'\0')
    size_t len = 0;
    while (src[len] != '\0') len++;
    len += 1; // 包含結束符的總拷貝字節(jié)數
    // 第二步:判斷內存重疊,選擇拷貝方向
    if (dst < src || dst >= src + len) {
        // 無重疊 / dst在src前面,從前向后拷貝性能更高
        for (size_t i = 0; i < len; i++) {
            dst[i] = src[i];
        }
    } else {
        // 重疊且dst在src后面,從后向前拷貝避免覆蓋未讀取的src內容
        // 注意:size_t是無符號類型,禁止寫i>=0(永遠為真),改為從len倒序到1
        for (size_t i = len; i > 0; i--) {
            dst[i-1] = src[i-1];
        }
    }
    return ret;
}

2.1 特點

  • 即使參數為空也返回nullptr,避免程序崩潰。
  • 正確處理所有內存重疊場景,例如dst = src + 2這類后向重疊場景,也能得到正確結果。
  • 仍然依賴調用方保證src以’\0’結尾、dst緩沖區(qū)足夠大。

3 高級版(緩存區(qū)防護)

在實際開發(fā)中,禁止使用無長度限制的strcpy,推薦實現帶緩沖區(qū)長度的安全版本,徹底避免溢出:

#include <cstddef>
char* my_strcpy_s(char* dst, size_t dst_size, const char* src) {
    if (dst == nullptr || src == nullptr || dst_size == 0) {
        return nullptr;
    }
    size_t i = 0;
    // 最多拷貝dst_size-1個字符,預留1個位置給'\0'
    while (src[i] != '\0' && i < dst_size - 1) {
        dst[i] = src[i];
        i++;
    }
    // 強制加結束符,保證dst永遠是合法C字符串(解決strncpy不自動加'\0'的缺陷)
    dst[i] = '\0';
    return dst;
}

3.1 特點

  • 完全避免緩沖區(qū)溢出,即使src遠長于dst的空間,也只會截斷到緩沖區(qū)可容納的最大長度。
  • 始終保證dst以’\0’結尾,不會出現非法字符串。

4 測試案例

測試場景用例代碼預期結果
普通字符串拷貝char dst[20]; my_strcpy(dst, “hello world”);dst內容為"hello world"
空字符串拷貝char dst[10]; my_strcpy(dst, “”);dst[0] == ‘\0’
自拷貝char buf[] = “test”; my_strcpy(buf, buf);buf內容不變,仍為"test"
后向內存重疊char buf[20] = “abcdefgh”; my_strcpy(buf+2, buf);buf內容為"ababcdefgh"(基礎版會得到"abababab…"錯誤結果)
空參數傳入my_strcpy(nullptr, “test”);返回nullptr,程序不崩潰
緩沖區(qū)不足(安全版)char dst[5]; my_strcpy_s(dst, 5, “hello world”);dst內容為"hell",自動截斷并加結束符

5 使用場景

  • const 正確性:src參數必須加const修飾,既可以傳入const字符串,也能避免函數內部誤修改源字符串。
  • 指針溢出:嵌入式 / 內核開發(fā)中,若src地址接近地址空間上限,src + len可能出現指針溢出,可轉為uintptr_t整數類型后再做范圍比較。
  • 性能取舍:如果業(yè)務不存在重疊場景,基礎版的性能更高;如果優(yōu)先保證安全性,直接使用帶長度的安全版本。

到此這篇關于C++中字符串拷貝函數strcpy的實現與優(yōu)化指南的文章就介紹到這了,更多相關C++字符串拷貝函數strcpy內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++ 實現求小于n的最大素數的實例

    C++ 實現求小于n的最大素數的實例

    這篇文章主要介紹了C++ 實現求小于n的最大素數的實例的相關資料,需要的朋友可以參考下
    2017-05-05
  • c++實現通用參數解析類示例

    c++實現通用參數解析類示例

    使用命令行執(zhí)行程序的時候在程序后可跟多個參數列表,而main函數的argc和argv分別存儲了相關的參數個數和參數內容,而循環(huán)輸入相關的時候就需要用戶自己來解析相關參數。以下代碼用c++的方式實現了相關解析的封裝,使用起來非常方便
    2014-03-03
  • C++實現推箱子功能附加回撤示例

    C++實現推箱子功能附加回撤示例

    本文主要介紹了C++實現推箱子功能附加回撤示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++中的復制構造函數詳解

    C++中的復制構造函數詳解

    今天小編就為大家分享一篇關于關于C++復制構造函數的實現講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2021-09-09
  • C語言的數組指針與函數指針詳解

    C語言的數組指針與函數指針詳解

    這篇文章主要為大家詳細介紹了C語言的數組指針與函數指針,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 基于Matlab制作一個不良圖片檢測系統(tǒng)

    基于Matlab制作一個不良圖片檢測系統(tǒng)

    這篇文章主要為大家詳細介紹了如何基于Matlab制作一個不良圖片檢測系統(tǒng),文中的示例代碼講解詳細,感興趣的可以跟隨小編一起了解一下
    2022-07-07
  • C/C++ 進程通訊(命名管道)的實例

    C/C++ 進程通訊(命名管道)的實例

    下面小編就為大家?guī)硪黄狢/C++ 進程通訊(命名管道)的實例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 在Qt中使用OpenGL繪制三角形指南

    在Qt中使用OpenGL繪制三角形指南

    在高性能渲染場景中,CPU資源常被過度消耗,導致界面卡頓,而OpenGL作為業(yè)界標準的圖形API,能通過GPU硬件加速顯著降低CPU負載,本文將以繪制三角形為例,教你如何通過Qt的QOpenGLWidget和QOpenGLFunctions實現跨平臺GPU渲染,感興趣的朋友一起看看吧
    2025-04-04
  • 解析ActiveMQ的使用說明總結

    解析ActiveMQ的使用說明總結

    本篇文章是對ActiveMQ的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Visual Studio C++指針靠前靠后的問題全面解析

    Visual Studio C++指針靠前靠后的問題全面解析

    這篇文章主要介紹了Visual Studio C++指針靠前靠后的問題全面解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04

最新評論

新民市| 乌兰察布市| 延吉市| 永川市| 大同县| 三门峡市| 克山县| 南昌市| 台北市| 明光市| 襄城县| 长沙县| 宜阳县| 睢宁县| 宜昌市| 娄底市| 南丰县| 大英县| 阜南县| 钟祥市| 福清市| 东安县| 阜宁县| 徐州市| 丹凤县| 盈江县| 彰武县| 禄丰县| 柳州市| 忻城县| 曲周县| 大连市| 北碚区| 曲阜市| 仲巴县| 昌乐县| 鹤庆县| 临猗县| 洛川县| 通城县| 铜陵市|