sprintf的问题

时间:2015-07-07 11:26:32

标签: c printf

我一直在尝试使用sprintf添加"到整数的开始和结束,但是当我使用超过10位数时,程序返回错误的数字:

int data2 = 12345678910;
char data3[2];  
sprintf(data3,"\"%i\"", data2);  
send(data3);

send函数将整数输出到屏幕。 我得到的结果是:

  

" -108508098"

发送功能在我在其他地方使用时起作用,并且它完成了它的设想。

2 个答案:

答案 0 :(得分:3)

在您进行修改之前,您的问题不仅仅是sprintf(您不应该使用哪种BTW,更喜欢snprintf),而是C中的整数(它们的位数有限,例如,在我的Linux桌面上最多64位....阅读computer number format& C data types上的wikipages。)

您使用sprintf是完全错误的(您已获得buffer overflow,这是undefined behavior)。你应该编码:

char buffer[32];
snprintf(buffer, sizeof(buffer), "%i", data2);
sendsomewhere(buffer);

请注意,POSIX send需要4个参数。您应该将您的功能重命名为sendsomewhere

您应该详细了解<stdint.h><limits.h>

您可能希望使用bignums(或至少int64_tlong long来表示12345678910等数字。不要重新发明bignums(他们很难有效地实施)。使用像gmplib

这样的库

如果你的64位足够(所以如果你的数字总是介于-2 63 ,即-9223372036854775808和2 63 - 1 ie 9223372036854775807),考虑使用long long(或unsigned long long)个C99C11个数字:

long long data2 = 12345678910;
char buffer[32];
snprintf(buffer, sizeof(buffer), "%lld", data2);
sendsomewhere(buffer);

如果64位不够,则应使用bigint s(但最近的一些编译器可能会为128-bits整数提供一些_int128_t类型。

别忘了启用所有警告&amp;编译时调试信息(例如使用gcc -Wall -Wextra -g),然后学习如何使用调试器(例如gdb

答案 1 :(得分:-1)

  1. data2溢出了您已将其初始化为的值。
  2. 如果data3是int数据类型(+1表示NULL终止),则
  3. 11应该能够保留至少data2个字节,而您只为其分配了2个字节。
  4. 以下是一个示例代码段:

    #include <stdio.h>
    
    int main(void)
    {
        unsigned long long data2 = 12345678910;
        char data3[32];
        snprintf(data3, sizeof(data3), "\"%llu\"", data2);
        printf("%s\n", data3);
        return 0;
    }