snprintf
这个函数是要指定长度,而且编译器会进行越界检查的,所以必须保证目标长度比所有参数加起来长。可是考虑以下程序:
#include #include #define LENGTH 1024 int main() { char cache[LENGTH]; memset(cache, 0, LENGTH); snprintf(cache, sizeof(LENGTH), "%s/ruaruarua", cache); return 0; }
这个程序开了-Wall
之后会报错:
test.c: In function ‘main’: test.c:9:44: error: ‘/ruaruarua’ directive output truncated writing 10 bytes into a region of size 4 [-Werror=format-truncation=] snprintf(cache, sizeof(LENGTH), "%s/ruaruarua", cache); ~~~~^~~~~~ test.c:9:5: note: ‘snprintf’ output 11 or more bytes into a destination of size 4 snprintf(cache, sizeof(LENGTH), "%s/ruaruarua", cache); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ cc1: all warnings being treated as errors
这个错误是符合预期的,因为确实有可能越界。那么问题来了,我怎样才能完成同样的功能但是不报错呢?
我的gcc
版本比较新,7.1.1
,估计老一点版本的编译器不会报这个错误。
首先
snprintf()
的第二个参数代表的是缓冲区的大小,在这里应该是LENGTH
,sizeof(LENGTH)
的值是4(我猜你想写的应该是
sizeof(cache)
吧)。那么,改成snprintf(cache, LENGTH, "%s/ruaruarua", cache);
之后就行了吗?我们看看这个例子:这个例子企图给
buf
末尾添加一个字符串,看看输出并没有达到期望的结果。这是为什么呢?
snprintf()
的手册里有这么一段:
的缓冲区设为数组中字符串的末尾:snprintf()
那该如何如何“向一个数组中打印自己原有的内容和一些新的内容”呢?一种方式是把传给printf()
那如何连续往缓冲区末尾添加数据呢?注意到家族的函数返回值都是打印的字符数(number of characters printed),那么可以这么调用: 结果为