一直有接触snprintf,经久不用知识点又会模糊,记录下来以便日后查看
【依赖头文件】
#include
【函数原型】
int snprintf(char *str, size_t size, const char *format, ...);
【函数参数】
str:目标字符串;size:拷贝字节数(Bytes); format:源字符串; ...格式
【函数功能】
最多从源字符串format中拷贝size字节的内容(含字符串结尾标志'\0')到目标字符串
The functions snprintf() write at most size bytes (including the terminating null byte ('\0')) to str.
【返回值】
成功返回源串的长度(strlen, 不含'\0')
失败返回负值
【例子及理解】
由于最多拷贝size个字节到目标字符串,那么通常目标字符串就设置成size大小就不会有越界问题
下面将目标字符串的长度设置为size大小,分别实验源串长度小于,等于,大于size的情况
【情形一】:源串小于目标字符串
实际上源串为:"123\0",所以只将字符'1','2','3', '\0'拷到了目标串,返回值为源串的strlen为3
1 #include
2 #include
3 #include
4 int main(void)
5 {
6 char a[10] = {'\0'};
7 int i = 0;
8 int ret = 0;
9 memset(a, 1, sizeof(a));
10 for(i = 0; i < 10; i++)
11 {
12 printf("a[%d] = %d\n",i,a[i]);
13 }
14
15 ret = snprintf(a, 10, "%d", 123);
16 printf("ret = %d\n",ret);
17
18 for(i = 0; i < 10; i++)
19 {
20 printf("a[%d] = %d\n",i,a[i]);
21 }
22 return 0;
23 }
root@ubuntu:/shiyan/shiyan265# gcc snprintf.c
root@ubuntu:/shiyan/shiyan265# ./a.out
a[0] = 1
a[1] = 1
a[2] = 1
a[3] = 1
a[4] = 1
a[5] = 1
a[6] = 1
a[7] = 1
a[8] = 1
a[9] = 1
ret = 3
a[0] = 49
a[1] = 50
a[2] = 51
a[3] = 0
a[4] = 1
a[5] = 1
a[6] = 1
a[7] = 1
a[8] = 1
a[9] = 1
root@ubuntu:/shiyan/shiyan265#
【情形二】:源串等于目标字符串
源串为"abcdefghi\0",正好将源串拷贝到目标字符串中,返回值为源串的strlen为9
1 #include
2 #include
3 #include
4 int main(void)
5 {
6 char a[10] = {'\0'};
7 int i = 0;
8 int ret = 0;
9 memset(a, 1, sizeof(a));
10 for(i = 0; i < 10; i++)
11 {
12 printf("a[%d] = %d\n",i,a[i]);
13 }
14
15 //ret = snprintf(a, 10, "%d", 123);
16 ret = snprintf(a, 10, "%s","abcdefghi");
17 printf("ret = %d\n",ret);
18
19 for(i = 0; i < 10; i++)
20 {
21 printf("a[%d] = %d\n",i,a[i]);
22 }
23 return 0;
root@ubuntu:/shiyan/shiyan265# gcc snprintf.c
root@ubuntu:/shiyan/shiyan265# ./a.out
a[0] = 1
a[1] = 1
a[2] = 1
a[3] = 1
a[4] = 1
a[5] = 1
a[6] = 1
a[7] = 1
a[8] = 1
a[9] = 1
ret = 9
a[0] = 97
a[1] = 98
a[2] = 99
a[3] = 100
a[4] = 101
a[5] = 102
a[6] = 103
a[7] = 104
a[8] = 105
a[9] = 0
root@ubuntu:/shiyan/shiyan265#
【情形三】源串大于目标字符串
源串为"abcdefghijklmnopq\0",最多从源串拷贝10个字节(含\0)到目标串那么就是拷贝源串的9个字节内容(abcdefghi)再加一个\0到目标串,目标串的结果和情形二一样,但是ret返回值变成了17,即strlen("abcdefghijklmnopq")
1 #include
2 #include
3 #include
4 int main(void)
5 {
6 char a[10] = {'\0'};
7 int i = 0;
8 int ret = 0;
9 memset(a, 1, sizeof(a));
10 for(i = 0; i < 10; i++)
11 {
12 printf("a[%d] = %d\n",i,a[i]);
13 }
14
15 //ret = snprintf(a, 10, "%d", 123);
16 //ret = snprintf(a, 10, "%s","abcdefghi");
17 ret = snprintf(a, 10, "%s", "abcdefghijklmnopq");
18 printf("ret = %d\n",ret);
19
20 for(i = 0; i < 10; i++)
21 {
22 printf("a[%d] = %d\n",i,a[i]);
23 }
24 return 0;
25 }
root@ubuntu:/shiyan/shiyan265# gcc snprintf.c
root@ubuntu:/shiyan/shiyan265# ./a.out
a[0] = 1
a[1] = 1
a[2] = 1
a[3] = 1
a[4] = 1
a[5] = 1
a[6] = 1
a[7] = 1
a[8] = 1
a[9] = 1
ret = 17
a[0] = 97
a[1] = 98
a[2] = 99
a[3] = 100
a[4] = 101
a[5] = 102
a[6] = 103
a[7] = 104
a[8] = 105
a[9] = 0
root@ubuntu:/shiyan/shiyan265#