//----------------------------------------------------
//AUTHOR: lanyang123456
//DATE: 2014-12-20
//----------------------------------------------------
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
sprintf(), snprintf() 将字符串写到 str中.
snprintf()函数最多将 size bytes(包括结束符'\0')写到str中。
举例:字符串连接。
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
const char *array[] = {"first element", "second string", "third int", "fourth char"};
char value[100];
memset(value, 0, 100);
int len = 0;
int i = 0;
for(i = 0; i < 4; i++)
{
int tmp_len = strlen(array[i]);
printf("the %d string len = %d\n", i, tmp_len);
snprintf(value + len, tmp_len + 1 + 1, "%s,", array[i]);
printf("%d after snprintf value + len = %s\n", i, value + len);
len += tmp_len + 1 + 1;
printf("%d len = %d\n", i, len);
}
printf("at last the value = %s\n", value);
return 0;
}
the result
$ gcc -o test2 main2.c
$ ./test2
the 0 string len = 13
0 after snprintf value + len = first element,
0 len = 15
the 1 string len = 13
1 after snprintf value + len = second string,
1 len = 30
the 2 string len = 9
2 after snprintf value + len = third int,
2 len = 41
the 3 string len = 11
3 after snprintf value + len = fourth char,
3 len = 54
at last the value = first element,
从输出可以看出,已经将array中的字符串全部拷贝到value 中,但为什么最后value却只输出了第一个字符串呢??
原因就是:
输出第一个字符串时就遇到了结束符'\0';
snprintf 将最多size 个字符拷贝到str中,这其中还包括‘\0’
所以
snprintf(value + len, tmp_len + 1 + 1, "%s,", array[i]);
tmp_len 是实际字符串长度,不包括'\0'
1 是‘,’逗号
1 是'\0'
也就是说,拷贝到value中的字符串是一个以'\0'结尾的字符串
所以最后输出只会输出第一个字符串,其实其他的字符串也在value中,只是没有输出。
可以将程序修改为如下:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
const char *array[] = {"first element", "second string", "third int", "fourth char"};
char value[100];
memset(value, 0, 100);
int len = 0;
int i = 0;
for(i = 0; i < 4; i++)
{
int tmp_len = strlen(array[i]);
printf("the %d string len = %d\n", i, tmp_len);
snprintf(value + len, tmp_len + 1 + 1, "%s,", array[i]);
printf("%d after snprintf value + len = %s\n", i, value + len);
len += tmp_len + 1;// delete terminal null \0
printf("%d len = %d\n", i, len);
}
printf("at last the value = %s\n", value);
return 0;
}
the result
the 0 string len = 13
0 after snprintf value + len = first element,
0 len = 14
the 1 string len = 13
1 after snprintf value + len = second string,
1 len = 28
the 2 string len = 9
2 after snprintf value + len = third int,
2 len = 38
the 3 string len = 11
3 after snprintf value + len = fourth char,
3 len = 50
at last the value = first element,second string,third int,fourth char,