snprintf给出不同的输出

时间:2013-11-28 20:41:10

标签: c printf

为什么snprintf在第二种情况下给出不同的值。是因为任何整数限制。你能解释一下snprintf是如何工作的以及为什么这个负值的原因

#include <stdio.h>
#include <string.h>

main()
{

   char buff[256];

   snprintf(buff,256,"%s %d"," value",1879056981);

   printf("%s",buff);

}

输出: value 1879056981

#include <stdio.h>
#include <string.h>

main()
{

   char buff[256];

   snprintf(buff,256,"%s %d"," value",2415927893);
   printf("%s",buff);

}

输出: value -1879039403

2 个答案:

答案 0 :(得分:1)

这是因为整数2415927893不能用你系统上的任何整数类型表示,并且你的程序中有签名溢出。

整数文字的确切类型取决于数字的大小。 C11定义整数文字可以是intlong intlong long int,具体取决于哪个符合 first 的顺序。

6.4.4.1整数常量

  

整数常量的类型是相应列表的第一个   其值可以表示。

打开编译器警告。

在我的系统上,当我用以下代码编译你的代码时,gcc会发出警告:  gcc -std=c11 -Wall -pedantic t.c

t.c:4:1: warning: return type defaults to ‘int’ [enabled by default]
t.c: In function ‘main’:
t.c:9:4: warning: format ‘%d’ expects argument of type ‘int’, but argument 5 has type ‘long long int’ [-Wformat]
t.c:9:4: warning: format ‘%d’ expects argument of type ‘int’, but argument 5 has type ‘long long int’ [-Wformat]

答案 1 :(得分:1)

文字2415927893被解释为int。由于它在您的计算机上大于INT_MAX,因此会出现溢出。

为避免这种情况,您可以将其解释为unsigned int:

snprintf(buff,256,“%s%u”,“value”,2415927893U);

或者长久以来:

snprintf(buff,256,“%s%lld”,“value”,241592789311);