linux进程snprintf函数功能,snprintf函数的使用(Windows和Linux下的区别)[转] - Something TO DO...

在C语言中,printf表示把字符串格式化输出到终端。sprintf表示把字符串格式化输出到另一个字符串。而snprintf表示把字符串格式化之后,输出指定位数到新的字符串。

我们看下面一段代码。

#include

#define COPY_LENGTH 5

int main() {

char buff[100] = {0};

int result = snprintf(buff, COPY_LENGTH, "ABCDEF");

printf("%d, %s\n", result, buff);

}

我在Windows环境编译执行(我的编译环境是:Win7x64 ,gcc 4.8.3),执行结果为-1, ABCDE。

然后把这段代码放到Ubuntu里编译执行(我的编译环境是:Ubuntu Desktop 10.04,gcc 4.8.2),执行结果为6, ABCD。

在网上找了一下原因,在Linux C语言里其定义应该如下:

int snprintf(char *restrict buf, size_t n, const char * restrict format, ...);

函数说明:最多从源串中拷贝 n - 1 个字符到目标串中,然后再在后面加一个 0 。所以如果目标串的大小为 n 的话,将不会溢出。

函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。

但在Windows平台,用snprintf只是引用_snprintf函数而已。_snprintf的定义如下:

int _snprintf(char *buffer, size_t count, const char *format [, argument] ...);

函数说明:

如果格式化后的字符串(源串)长度小于或者等于count,则拷贝源串到buffer,并返回源串长度。

如果格式化后的字符串(源串)长度大于count,则拷贝源串的前count个字符到buffer,并返回一个负数。

所以说,_snprintf函数最多可以比源串中拷贝 n 个字符到目标串中,有可能不会在后面加0。所以会出现上面的问题。如果想要使两者相同,可以在代码中直接把最后一位设置成0,这样两个平台就是一样的结果了。当然在实际应用中,可能根据要实现的功能,如何设置要自己判断。

比如,如果只是把最后一位设置为0,上面的代码可以改成:

#include

#define COPY_LENGTH 5

int main() {

char buff[100] = {0};

snprintf(buff, COPY_LENGTH, "ABCDE");

buff[COPY_LENGTH - 1] = 0;

printf("%s\n", buff);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
snprintf函数是一个可变参数函数,其功能是将格式化后的字符串写入到一个字符数组中。它的函数原型是int snprintf(char* dest_str, size_t size, const char* format, ...)。 该函数有两种情况: 1. 如果格式化后的字符串长度小于size,那么整个格式化后的字符串将被复制到dest_str中,并在末尾添加一个字符串结束符'\0'。这个函数会返回欲写入的字符串长度。 2. 如果格式化后的字符串长度大于等于size,那么只会将前size-1个字符复制到dest_str中,并在末尾添加一个字符串结束符'\0',函数同样会返回欲写入的字符串长度。 需要注意的是,snprintf函数并不是标准C/C++中规定的函数,但在许多编译器中厂商提供了其实现的版本。在gcc中,该函数名称就是snprintf,在VC中则称为_snprintf。如果在VC中使用snprintf函数,会提示此函数未声明,可以将其改为_snprintf即可。 与sprintf函数不同的是,snprintf函数可以避免发生缓冲区溢出的问题,因为它可以指定写入的字符数组的大小,当格式化后的字符串长度超过设定的大小时,snprintf函数会自动截断字符串。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [c语言snprintf函数简介](https://blog.csdn.net/weixin_33701564/article/details/93488346)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [snprintf( )函数简介](https://blog.csdn.net/sk983671939/article/details/79722680)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值