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

C++面試八股文之如何實(shí)現(xiàn)strncpy函數(shù)

 更新時(shí)間:2023年07月04日 08:20:28   作者:二進(jìn)制架構(gòu)  
strncpy函數(shù),主要用做字符串復(fù)制,將于字符從一個(gè)位置復(fù)制到另一個(gè)位置,那么如何實(shí)現(xiàn)一個(gè)strncpy函數(shù),下面小編就來和大家簡(jiǎn)單講講吧

某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第31面:

面試官:strcpy函數(shù)使用過吧?

二師兄:用過。

面試官:這個(gè)函數(shù)有什么作用?

二師兄:主要用做字符串復(fù)制,將于字符從一個(gè)位置復(fù)制到另一個(gè)位置。

面試官:strncpy函數(shù)也使用過吧,和strcpy有何不同?

二師兄:strncpy多了一個(gè)size_t的參數(shù),用于避免緩沖區(qū)溢出。

面試官:能否實(shí)現(xiàn)一個(gè)strncpy函數(shù)?

二師兄:好的。

void strncpy(char *dest, char *src, size_t n)
{
    for (size_t i = 0; i < n; i++)
    {
        *(dest + i) = *(src + i);
    }
}

面試官:額。。如果strlen(src) < n會(huì)發(fā)生什么?

二師兄:嗯。。那要做個(gè)判斷。。

void strncpy(char *dest, char *src, size_t n)
{
    size_t len = strlen(src) > n ? n : strlen(src);
    for (size_t i = 0; i < len; i++)
    {
        *(dest + i) = *(src + i);
    }
}

面試官:如果strlen(dest) < n呢?

二師兄:因?yàn)?code>n是程序員傳入進(jìn)來的,且無法知曉dest的長度,所以這個(gè)n要程序員保證它的正確性。

面試官:有沒有更簡(jiǎn)潔的寫法?比如利用指針的自增?

二師兄:讓我想想。。

void strncpy(char *dest, char *src, size_t n)
{
    while(n-- && (*dest++ = *src++));
}

面試官:如果用戶傳入的src是字符串常量,會(huì)發(fā)生什么?

二師兄:額。。。讓我想想。。明白了,要在src前加上const修飾符:

void strncpy(char *dest, const char *src, size_t n)
{
    while(n-- && (*dest++ = *src++));
}

面試官:有一些操作需要strcpy嵌套strcpy,如果要實(shí)現(xiàn)這個(gè)功能,需要做哪些修改?

二師兄:你說的是strncpy(strncpy(...)...)這種操作嗎?

面試官:是的。

二師兄:那么需要返回dest地址:

char *strncpy(char *dest, const char *src, size_t n)
{
    char *ret = dest;
    while (n-- && (*dest++ = *src++));
    return ret;
}

面試官:如果srcdest的內(nèi)存地址有重疊,會(huì)發(fā)生什么?

二師兄:這要分為兩種情況,第一種情況:dest < src < dest+n

二師兄:此時(shí)并不需要特殊的處理,拷貝完成后,整個(gè)字符串是這樣的:

二師兄:雖然src被覆寫了,但是dest的內(nèi)容是正確的。

二師兄:第二種情況,src < dest <src+n;

二師兄:如果直接拷貝,結(jié)果會(huì)變成這樣:

二師兄:此時(shí)dest的內(nèi)容是錯(cuò)誤的。所以我們需要對(duì)這種情況做特殊處理:

char *strncpy(char *dest, const char *src, size_t n)
{
    char *ret = dest;
    size_t len = strlen(src) > n ? n :strlen(src);
    if(src < dest && dest < src + len)  //需要從尾部開始拷貝
    {
        const char* s = src + len - 1;
        char* d = dest + len - 1;
        while(len --) *d-- = *s--;
        return ret;
    }
    while (n-- && (*dest++ = *src++));
    return ret;
}

面試官:嗯。有沒有什么辦法對(duì)以上的代碼做一些性能上的優(yōu)化?

二師兄:可以使用SIMD(Single Instruction Multiple Data)指令對(duì)strncpy函數(shù)做一些優(yōu)化。*dest++ = *src++每次只能復(fù)制一個(gè)字節(jié)的內(nèi)容,而SIMD每次可以復(fù)制超過一個(gè)字節(jié)的內(nèi)容,當(dāng)數(shù)據(jù)量大的時(shí)候,效率會(huì)有明顯的提升。

面試官:寫過SIMD相關(guān)的代碼嗎?

二師兄:只是聽說過,沒有用過。

面試官:好的,今天就到這里,請(qǐng)回去等通知吧。

什么是SIMD?SIMD真的能夠提升效率嗎?

SIMD是一種常見的并行計(jì)算技術(shù),一條指令可以同時(shí)處理多個(gè)數(shù)據(jù),所以它可以減少指令的數(shù)量,從而提高處理速度。

X86_64架構(gòu)下,SIMD的指令集主要包括MMX、SSE、AVX。

下面代碼演示如果使用SIMD技術(shù)加速大容量字符串的拷貝:

#include <emmintrin.h>
void strncpy_simd(char *dest, const char *src, size_t n)
{
    size_t len = strlen(src) > n ? n : strlen(src);
    __m128i *d = (__m128i *)dest;
    const __m128i *s = (const __m128i *)src;
    while (len >= sizeof(__m128i))
    {
        _mm_storeu_si128(d++, _mm_loadu_si128(s++));
        len -= sizeof(__m128i);
    }
    char *dc = (char *)d;
    const char *sc = (const char *)s;
    while (len--)
    {
        *dc++ = *sc++;
    }
}

今天的面試到這里就結(jié)束了,感謝大家的耐心~

到此這篇關(guān)于C++面試八股文之如何實(shí)現(xiàn)strncpy函數(shù)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)strncpy函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt使用QWT繪制柱狀圖詳解

    Qt使用QWT繪制柱狀圖詳解

    QT中提供了一個(gè)叫做QWT的庫。QWT,全稱是Qt?Widgets?for?Technical?Applications,是一個(gè)基于LGPL版權(quán)協(xié)議的開源項(xiàng)目,可生成各種統(tǒng)計(jì)圖。本文將通過它繪制柱狀圖,需要的可以參考一下
    2022-01-01
  • C++實(shí)現(xiàn)文本與二進(jìn)制文件讀寫操作的示例

    C++實(shí)現(xiàn)文本與二進(jìn)制文件讀寫操作的示例

    在C++開發(fā)中,文件操作是必備技能之一,本文將全面解析C++文件讀寫的操作方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01
  • 詳解C語言之文件操作(上)

    詳解C語言之文件操作(上)

    這篇文章主要介紹了關(guān)于C語言文件操作方法的相關(guān)資料,小編覺得這篇文章寫的還不錯(cuò),需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-11-11
  • C++實(shí)現(xiàn)圖書館管理系統(tǒng)

    C++實(shí)現(xiàn)圖書館管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言實(shí)現(xiàn)軍旗游戲的示例代碼

    C語言實(shí)現(xiàn)軍旗游戲的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C語言實(shí)現(xiàn)軍旗游戲,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-11-11
  • 一文讀懂C++ 虛函數(shù) virtual

    一文讀懂C++ 虛函數(shù) virtual

    這篇文章主要介紹了C++ 虛函數(shù) virtual的相關(guān)資料,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 深入了解C++異常處理

    深入了解C++異常處理

    任何東西都可以認(rèn)為是異常,錯(cuò)誤只是異常的一種。本文將帶大家了解C++中異常是什么,是如何捕獲和處理的等相關(guān)知識(shí)。文中示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以了解一下
    2021-12-12
  • C語言動(dòng)態(tài)分配二維字符串?dāng)?shù)組的方法

    C語言動(dòng)態(tài)分配二維字符串?dāng)?shù)組的方法

    小編最近忙里偷閑,給大家整理一份教程關(guān)于C語言動(dòng)態(tài)分配二維字符串?dāng)?shù)組的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-10-10
  • C++獲取本機(jī)登陸過的QQ號(hào)碼示例程序

    C++獲取本機(jī)登陸過的QQ號(hào)碼示例程序

    這篇文章主要介紹了使用C++獲取本機(jī)登陸過的QQ號(hào)碼列表的程序示例,大家可以參考使用
    2013-11-11
  • C語言實(shí)現(xiàn)簡(jiǎn)單的通訊錄

    C語言實(shí)現(xiàn)簡(jiǎn)單的通訊錄

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)單的通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02

最新評(píng)論

夏邑县| 麻栗坡县| 长沙市| 苍南县| 柘城县| 隆子县| 黄浦区| 郸城县| 郧西县| 汝阳县| 株洲县| 中江县| 天气| 沿河| 甘肃省| 望谟县| 沙雅县| 都兰县| 广河县| 崇左市| 麻城市| 托克托县| 灌南县| 台湾省| 拉孜县| 光山县| 土默特右旗| 高唐县| 平乡县| 水城县| 芮城县| 安仁县| 出国| 区。| 新巴尔虎右旗| 伊金霍洛旗| 元江| 廉江市| 温泉县| 焦作市| 城口县|