LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2724|回复: 6

snprintf的奇怪现象

[复制链接]
发表于 2007-8-11 22:29:50 | 显示全部楼层 |阅读模式

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. int main() {
  5.         char text[256];
  6.         int i;

  7.         bzero(text,sizeof(text));
  8.         for(i = 0; i < 10; i++){
  9.                 sprintf(text,"%s %d",text,i);
  10.         }
  11.         printf("%s\n",text);
  12.         return 0;
  13. }
复制代码

输出是:0 1 2 3 4 5 6 7 8 9
这是对的

把sprintf(text,"%s %d",text,i);换成snprintf(text,sizeof(text),"%s %d",text,i);就只输出9了,是bug吗?
发表于 2007-8-12 08:09:04 | 显示全部楼层
关注中...

把 snprintf() 这句换成 snprintf (text, sizeof(text),"%d %s", i, text); 就更有意思了。
回复 支持 反对

使用道具 举报

发表于 2007-8-12 09:19:41 | 显示全部楼层
The behavior of this function is undefined if copying takes place between objects that overlap--for example, if s is also given as an argument to be printed under control of the %s conversion.
请注意看手册,你这样的用法会导致不可预料的结果。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-12 10:59:34 | 显示全部楼层
Post by realtang
The behavior of this function is undefined if copying takes place between objects that overlap--for example, if s is also given as an argument to be printed under control of the %s conversion.
请注意看手册,你这样的用法会导致不可预料的结果。

我郁闷了,原先感觉snprintf和sprintf唯一的区别就是snprintf会去检测越界,snprintf会在函数内部先保证没有越界后再去调用sprintf;不理解为什么snprintf无法做到sprintf能做到的事
回复 支持 反对

使用道具 举报

发表于 2007-8-12 11:21:05 | 显示全部楼层
Post by realtang
The behavior of this function is undefined if copying takes place between objects that overlap--for example, if s is also given as an argument to be printed under control of the %s conversion.
请注意看手册,你这样的用法会导致不可预料的结果。

当我看到这个帖子时,首先猜测是这个问题。不过在snprintf的manual page里没有找到答案。
请问版主是从什么手册中看到的这段信息?
回复 支持 反对

使用道具 举报

发表于 2007-8-12 13:09:24 | 显示全部楼层
Post by asert
我郁闷了,原先感觉snprintf和sprintf唯一的区别就是snprintf会去检测越界,snprintf会在函数内部先保证没有越界后再去调用sprintf;不理解为什么snprintf无法做到sprintf能做到的事

那么LZ的实验证明了这不是一回事了。
回复 支持 反对

使用道具 举报

发表于 2007-8-15 21:17:51 | 显示全部楼层
Post by asert
我郁闷了,原先感觉snprintf和sprintf唯一的区别就是snprintf会去检测越界,snprintf会在函数内部先保证没有越界后再去调用sprintf;不理解为什么snprintf无法做到sprintf能做到的事


snprintf不是这么实现的

snprintf是调用vsnprintf

是每次格式化的时候(也就是每次格式化完一小段%描述的格式的时候)都去调用一个复制函数,那个函数里面判断是否有越界.越界了就不再复制


sprintf是也是调用了vsnprintf实现的.只不过n传的是0xffffffff.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表