Linux:C字符串拷贝中的陷阱(strncpy,snprintf)

snprintf函数介绍

snprintf(),函数原型为int snprintf(char *str, size_t size, const char *format, ...)。

两点注意:

(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');

(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为欲写入的字符串长度。(重点)

(3)snprintf的返回值是欲写入的字符串长度,而不是实际写入的字符串度。

假设我们有一个数组buf[5],我们想在里面写入正确的数据,不让数据越界那么我们应该:

复制代码
int main()
{
    char buf[5]="1234"; //只能存放4个数据
    buf[4]='5';
    qDebug()<<"sizeof = "<<sizeof(buf);
    qDebug()<<"strlen = "<<strlen(buf);
    int n;
    n = snprintf(buf,sizeof(buf),"%s","helloworld");//注意这里不能写-1,因为函数会自动写入n-1个字节,如果写-1只能写入3个数据
    qDebug()<<buf;
    qDebug()<<n;
}

strncpy函数介绍

使用strncpystrncpy(target,source,n)把source中的n个字符或空字符之前的字符(先满足哪个条件就拷贝到何处)拷贝到target中。因此,如果source中的字符数小于n,则拷贝整个字符串,包括空字符。但是,strncpy()拷贝字符串的长度不会超过n,如果拷贝到第n个字符时还未拷贝完整个源字符串,就不会拷贝空字符。所以,拷贝的副本中不一定有空字符。鉴于此,该程序把n设置为比目标数组大小少1(TARGSIZE-1),然后把数组最后一个元素设置为空字符。

cpp 复制代码
  char buf[5]="1234";//只能存放4个数据
    buf[4]='5';
    qDebug()<<"sizeof = "<<sizeof(buf);
    qDebug()<<"strlen = "<<strlen(buf);

    strncpy(buf,"helloworld",sizeof(buf)-1);//必须要-1,不然会写入5个字节,4个字节会把最后一个字节污染,必须使用以下代码,才能保证程序的正常。
    buf[sizeof(buf)-1]='\0';
    qDebug()<<buf;

strncat函数介绍

cpp 复制代码
    char buf[5]="12";//只能存放4个数据

    qDebug()<<"sizeof = "<<sizeof(buf);
    qDebug()<<"strlen = "<<strlen(buf);
    qDebug()<<buf;


    char buf1[] = "3456";

    qDebug()<<"sizeof = "<<sizeof(buf1);
    qDebug()<<"strlen = "<<strlen(buf1);

//    strncat(buf,"3456",sizeof(buf));//注意:好多人都喜欢这样写其实是不对的,
    strncat(buf,buf1,sizeof(buf)-strlen(buf)-1 );//正确写法 总长度-当前长度-1
相关推荐
MATLAB代码顾问4 小时前
5大智能算法优化标准测试函数对比(Python实现)
开发语言·python
wuminyu5 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
万粉变现经纪人5 小时前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
清风明月一壶酒5 小时前
OpenClaw自动处理Word文档全流程
开发语言·c#·word
其实防守也摸鱼5 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
Navigator_Z6 小时前
LeetCode //C - 1033. Moving Stones Until Consecutive
c语言·算法·leetcode
小郑加油6 小时前
python学习Day12:pandas安装与实际运用
开发语言·python·学习
AC赳赳老秦6 小时前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw
KuaCpp7 小时前
C++面向对象(速过复习版)
开发语言·c++
wbs_scy7 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言