long 和 int 的大小是多少?
如果 nID 以 'int' 格式和 sizeof(int) != sizeof(long) 长时间打印,则从那里开始您将获得未对齐的数据访问(从某种意义上说,对齐不正确)。
您使用的是哪个编译器?如果这是问题所在,GCC 应该毫无困难地诊断问题。同样,如果 nID 是“long long”,您可能会遇到问题。
回答您的问题 - 是的,sprintf() 必须能够处理的字符串长度的上限有一个下限。 C89 系统为 509,C99 系统为 4095。
准确地说,C99 说(fprintf(),第 7.19.6.1 节,第 15 段):
任何一次转换可以产生的字符数至少应为
4095.
sprintf() 没有进一步的限定。
将修改后的示例的固定版本转换为可编译代码:
#include <stdio.h>
int main(void)
{
char test[255] = {0};
int test1 = 2;
double test2 = 35.00;
int test3 = 0;
sprintf(test, "%d|%f|%d", test1, test2, test3);
puts(test);
return(0);
}
我得到了我期望的输出:
2|35.000000|0
要获得显示的输出,您必须使用非常奇怪的设置。
您所显示的行为表明您正在使用的sprintf() 函数对某些内容的对齐方式或大小感到困惑。您是否有范围内的原型 - 也就是说,您是否已#included <stdio.h>?使用 GCC,当我省略标题时会收到各种警告:
x.c: In function ‘main’:
x.c:8: warning: implicit declaration of function ‘sprintf’
x.c:8: warning: incompatible implicit declaration of built-in function ‘sprintf’
x.c:9: warning: implicit declaration of function ‘puts’
但即使将test2 重新定义为float,我也会得到正确的结果。
如果我将test2 更改为long double,则会收到一组不同的警告和不同的结果:
x.c: In function ‘main’:
x.c:8: warning: implicit declaration of function ‘sprintf’
x.c:8: warning: incompatible implicit declaration of built-in function ‘sprintf’
x.c:8: warning: format ‘%f’ expects type ‘double’, but argument 4 has type ‘long double’
x.c:9: warning: implicit declaration of function ‘puts’
2|0.000000|0
这与您所看到的更接近,但远非完全相同。
由于我们没有平台信息,我怀疑您正在使用真正古老的(或者我的意思是错误的?)C 版本。但我仍然不知道如何你得到你所展示的 - 除非你在一个大端机器上(我正在使用 MacOS X 10.6.2 的 Intel Mac 上测试)......暂停......在 SPARC 机器上运行Solaris 10,没有#include <stdio.h> 和long double test2 = 35.0;,我得到:
gcc -O x.c -o x && ./x
x.c: In function 'main':
x.c:8: warning: incompatible implicit declaration of built-in function 'sprintf'
2|-22446048024026502740613283801712842727785152907992454451420278635613183447049251888877319095301502091725503415850736723945766334416305449970423980980099172087880564051243997662107950451281495566975073444407658980167407319222477077473080454782593800009947058951029590025152409694784570786541673131117073399808.000000|0
那不一样;它还会生成 321 个字符的输出,因此那里存在缓冲区溢出 - 最好使用“snprintf()”来防止这种情况发生。当事情被正确声明时,当然,我得到了预期的结果。
那么,您可以发布显示您的问题的可编译代码,而不是不显示问题的 sn-p 吗?你能确定你的平台——机器类型、操作系统版本、编译器版本(可能还有 C 库版本)吗?