C++面试八股文之如何实现strncpy函数

 更新时间:2023年07月04日 08:20:28   作者:二进制架构  
strncpy函数,主要用做字符串复制,将于字符从一个位置复制到另一个位置,那么如何实现一个strncpy函数,下面小编就来和大家简单讲讲吧

某日二师兄参加XXX科技公司的C++工程师开发岗位第31面:

面试官:strcpy函数使用过吧?

二师兄:用过。

面试官:这个函数有什么作用?

二师兄:主要用做字符串复制,将于字符从一个位置复制到另一个位置。

面试官:strncpy函数也使用过吧,和strcpy有何不同?

二师兄:strncpy多了一个size_t的参数,用于避免缓冲区溢出。

面试官:能否实现一个strncpy函数?

二师兄:好的。

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

面试官:额。。如果strlen(src) < n会发生什么?

二师兄:嗯。。那要做个判断。。

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是字符串常量,会发生什么?

二师兄:额。。。让我想想。。明白了,要在src前加上const修饰符:

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

面试官:有一些操作需要strcpy嵌套strcpy,如果要实现这个功能,需要做哪些修改?

二师兄:你说的是strncpy(strncpy(...)...)这种操作吗?

面试官:是的。

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

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

面试官:如果srcdest的内存地址有重叠,会发生什么?

二师兄:这要分为两种情况,第一种情况:dest < src < dest+n

二师兄:此时并不需要特殊的处理,拷贝完成后,整个字符串是这样的:

二师兄:虽然src被覆写了,但是dest的内容是正确的。

二师兄:第二种情况,src < dest <src+n;

二师兄:如果直接拷贝,结果会变成这样:

二师兄:此时dest的内容是错误的。所以我们需要对这种情况做特殊处理:

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

面试官:嗯。有没有什么办法对以上的代码做一些性能上的优化?

二师兄:可以使用SIMD(Single Instruction Multiple Data)指令对strncpy函数做一些优化。*dest++ = *src++每次只能复制一个字节的内容,而SIMD每次可以复制超过一个字节的内容,当数据量大的时候,效率会有明显的提升。

面试官:写过SIMD相关的代码吗?

二师兄:只是听说过,没有用过。

面试官:好的,今天就到这里,请回去等通知吧。

什么是SIMDSIMD真的能够提升效率吗?

SIMD是一种常见的并行计算技术,一条指令可以同时处理多个数据,所以它可以减少指令的数量,从而提高处理速度。

X86_64架构下,SIMD的指令集主要包括MMXSSEAVX

下面代码演示如果使用SIMD技术加速大容量字符串的拷贝:

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

今天的面试到这里就结束了,感谢大家的耐心~

到此这篇关于C++面试八股文之如何实现strncpy函数的文章就介绍到这了,更多相关C++实现strncpy函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt使用QWT绘制柱状图详解

    Qt使用QWT绘制柱状图详解

    QT中提供了一个叫做QWT的库。QWT,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目,可生成各种统计图。本文将通过它绘制柱状图,需要的可以参考一下
    2022-01-01
  • C++实现文本与二进制文件读写操作的示例

    C++实现文本与二进制文件读写操作的示例

    在C++开发中,文件操作是必备技能之一,本文将全面解析C++文件读写的操作方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-01-01
  • 详解C语言之文件操作(上)

    详解C语言之文件操作(上)

    这篇文章主要介绍了关于C语言文件操作方法的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助
    2021-11-11
  • C++实现图书馆管理系统

    C++实现图书馆管理系统

    这篇文章主要为大家详细介绍了C++实现图书馆管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言实现军旗游戏的示例代码

    C语言实现军旗游戏的示例代码

    这篇文章主要为大家详细介绍了如何利用C语言实现军旗游戏,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-11-11
  • 一文读懂C++ 虚函数 virtual

    一文读懂C++ 虚函数 virtual

    这篇文章主要介绍了C++ 虚函数 virtual的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 深入了解C++异常处理

    深入了解C++异常处理

    任何东西都可以认为是异常,错误只是异常的一种。本文将带大家了解C++中异常是什么,是如何捕获和处理的等相关知识。文中示例代码简洁易懂,感兴趣的小伙伴可以了解一下
    2021-12-12
  • C语言动态分配二维字符串数组的方法

    C语言动态分配二维字符串数组的方法

    小编最近忙里偷闲,给大家整理一份教程关于C语言动态分配二维字符串数组的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-10-10
  • C++获取本机登陆过的QQ号码示例程序

    C++获取本机登陆过的QQ号码示例程序

    这篇文章主要介绍了使用C++获取本机登陆过的QQ号码列表的程序示例,大家可以参考使用
    2013-11-11
  • C语言实现简单的通讯录

    C语言实现简单的通讯录

    这篇文章主要为大家详细介绍了C语言实现简单的通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02

最新评论