snprintf的使用

59 篇文章 1 订阅

//----------------------------------------------------

//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,






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值