近段时间,在写程序中多次用到snprintf()函数,对于snprintf()函数是否会自动添加\0不能肯定,今天自己就写了一个测试程序进行验证。
int len = snprintf(buf, sizeof(buf), "%s", str)
1、当len 的长度小于sizeof(buf)时,这个结果毋庸置疑的,肯定是会增加\0
2、当len >= sizeof(buf)时,buf 中是否会增加\0,会有疑问,
#include <stdio.h>
#include <string.h>int main()
{char buf[10];int len = snprintf(buf, sizeof(buf), "%s", "helloworldtest");printf("%d:%ld:%s\n", len ,strlen(buf), buf);printf("%p:%p:%p\n", buf, buf + strlen(buf), buf + strlen(buf) + 1);/* 打印地址中对应的字符 */printf("%c:%c:%d:%d\n", *buf, *(buf + strlen(buf) - 1),*(buf + strlen(buf)), *(buf + strlen(buf) + 1));return 0;
}
因此可以看出,无论字符串长度是否超过buf 的长度,buf中都是增加\0, 但此时snprintf()返回的len 长度并不一定准确,因此建议我们书写时最好的方式如下:
len = snprintf(buf, sizeof(buf) - 1, "%s", str) , sizeof(buf) -1 可以确保最后一个字节会增加\0,
strncpy()函数:
就是把src指向的字符串的前size_t n个字符(不包括\0,\0得自己手动加在*dest被复制之后)复制到dest指向的字符串中。如果要复制的*src的部分有\0,就把\0复制进去,之后就提前结束,即使没复制到第size_t n个字符也是。返回指向*dest的指针。