snprintf和strncpy对比
有关snprintf返回值更多信息,请参考:http://bbs.hadoopor.com/thread-1185-1-1.html
snprintf MAN手册: The functions snprintf() and vsnprintf() do not write more than size bytes (including the trailing '\0') 这句话表示snprintf总是会将'\0'写入。 strncpy MAN手册: The strncpy() function is similar, except that not more than n bytes of src are copied. Thus, if there is no null byte among the first n bytes of src, the result will not be null-terminated. 这句话表明如果源字符串比指定的目标长度大,则不会写入'\0',也就是strncpy总是严格尊守指定大小,绝不越雷池半步,也绝不做份外的工作,可以理解成死板。 从上可以看出,snprintf和strncpy用法稍有不同,分别如下: char dst[X]; char src[Z]; snprintf(dst, sizeof(dst), "%s", src); strncpy(dst, src, sizeof(dst)-1); dst[sizeof(dst)-1] = '\0'; 测试代码: int main() { char dest1[3]; char dest2[3]; char src[] = "0123456789"; printf("src[2]=%d,%c\n", src[2], src[2]); strncpy(dest1, src, sizeof(dest1)-1); printf("dest1[2]=%d,%c\n", dest1[2],dest1[2]); // dest1[2]是一个未初始化的随机值 snprintf(dest2, sizeof(dest2), "%s", src); printf("dest2[2]=%d,%c\n", dest2[2],dest2[2]); // dest2[2]总是一个C字符串结尾符'\0' return 0; } 也就是strncpy总是拷贝指定大小的字节数,绝不会多做,所以不会自动加结尾符'\0',除非指定大小的字节数范围内的src已经包含了结尾符'\0'。 但snprintf总是只拷贝指定大小减1后的字节数,然后再自动加上结尾符'\0'。因此对于上述strncpy的用法,还应当加上: dest1[sizeof(dest1)-1] = '\0'; 这个时候就正常了,当然也可以:
所以对于strncpy是否需要sizeof()-1,也并非必要的,完全可以只sizeof(),但一定得再加上结尾符'\0'。 从上也可以看出,不管是strncpy还是snprintf,它们都会尊重sizeof(),都不会向dest拷贝超过sizeof()大小的字节数。 |
分类:
C/C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义