我一直在尝试使用sprintf添加"到整数的开始和结束,但是当我使用超过10位数时,程序返回错误的数字:
int data2 = 12345678910;
char data3[2];
sprintf(data3,"\"%i\"", data2);
send(data3);
send函数将整数输出到屏幕。 我得到的结果是:
" -108508098"
发送功能在我在其他地方使用时起作用,并且它完成了它的设想。
答案 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_t
或long long
来表示12345678910等数字。不要重新发明bignums(他们很难有效地实施)。使用像gmplib
如果你的64位足够(所以如果你的数字总是介于-2 63 ,即-9223372036854775808和2 63 - 1 ie 9223372036854775807),考虑使用long long
(或unsigned long long
)个C99或C11个数字:
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)
data2
溢出了您已将其初始化为的值。data3
是int数据类型(+1表示NULL终止),则11
应该能够保留至少data2
个字节,而您只为其分配了2个字节。以下是一个示例代码段:
#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;
}