欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

二師兄:用過。

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

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

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

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

面試官:能否實現(xiàn)一個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會發(fā)生什么?

二師兄:嗯。。那要做個判斷。。

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呢?

二師兄:因為n是程序員傳入進來的,且無法知曉dest的長度,所以這個n要程序員保證它的正確性。

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

二師兄:讓我想想。。

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

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

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

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

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

二師兄:你說的是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)存地址有重疊,會發(fā)生什么?

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

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

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

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

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

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

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;
}

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

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

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

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

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

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

SIMD是一種常見的并行計算技術(shù),一條指令可以同時處理多個數(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++面試八股文之如何實現(xiàn)strncpy函數(shù)的文章就介紹到這了,更多相關(guān)C++實現(xiàn)strncpy函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 貪吃蛇C語言代碼實現(xiàn)(難度可選)

    貪吃蛇C語言代碼實現(xiàn)(難度可選)

    這篇文章主要為大家詳細介紹了貪吃蛇C語言代碼實現(xiàn),游戲難度可供選擇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言智能指針之weak_ptr淺析

    C語言智能指針之weak_ptr淺析

    這篇文章主要介紹了 C++11智能指針之weak_ptr詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • C++ 自由存儲區(qū)是否等價于堆你知道嗎

    C++ 自由存儲區(qū)是否等價于堆你知道嗎

    自由存儲是C++中通過new與delete動態(tài)分配和釋放對象的抽象概念,而堆(heap)是C語言和操作系統(tǒng)的術(shù)語,是操作系統(tǒng)維護的一塊動態(tài)分配內(nèi)存
    2021-08-08
  • C++分析如何用虛析構(gòu)與純虛析構(gòu)處理內(nèi)存泄漏

    C++分析如何用虛析構(gòu)與純虛析構(gòu)處理內(nèi)存泄漏

    虛析構(gòu)和純虛析構(gòu)共性:可以解決父類指針釋放子類對象,都需要有具體的函數(shù)實現(xiàn);虛析構(gòu)和純虛析構(gòu)區(qū)別:如果是純虛析構(gòu),該類屬于抽象類,無法實例化對象
    2022-08-08
  • C++命名空間使用詳細介紹

    C++命名空間使用詳細介紹

    考慮一種情況,當我們有兩個同名的人,Zara,在同一個班里。當我們需要對它們進行區(qū)分我們必須使用一些額外的信息和它們的名字,比如它們生活在不同的區(qū)域或者興趣愛好什么的,在C++程序中也會遇到同樣的情況,所以命名空間就此產(chǎn)生
    2022-09-09
  • Qt結(jié)合libqrencode生成二維碼的實現(xiàn)示例

    Qt結(jié)合libqrencode生成二維碼的實現(xiàn)示例

    本文主要介紹了Qt結(jié)合libqrencode生成二維碼的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語言scandir函數(shù)獲取文件夾內(nèi)容的實現(xiàn)

    C語言scandir函數(shù)獲取文件夾內(nèi)容的實現(xiàn)

    scandir?函數(shù)用于列舉指定目錄下的文件列表,本文主要介紹了C語言scandir函數(shù)獲取文件夾內(nèi)容的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • C/C++?pthread線程庫使用示例詳解

    C/C++?pthread線程庫使用示例詳解

    這篇文章主要介紹了C/C++?pthread線程庫使用示例詳解,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • vc6.0中c語言控制臺程序中的定時技術(shù)(定時器)

    vc6.0中c語言控制臺程序中的定時技術(shù)(定時器)

    這篇文章主要介紹了vc6.0中c語言控制臺程序中的定時技術(shù)(定時器),需要的朋友可以參考下
    2014-04-04
  • C+繼承之同名覆蓋,函數(shù)重寫與多態(tài)詳解

    C+繼承之同名覆蓋,函數(shù)重寫與多態(tài)詳解

    這篇文章主要介紹了C+繼承之同名覆蓋,函數(shù)重寫與多態(tài),是C++面向?qū)ο蟪绦蛟O(shè)計非常重要的概念,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09

最新評論