gpt4 book ai didi

c - sprintf 的问题

转载 作者:行者123 更新时间:2023-11-30 20:13:22 25 4
gpt4 key购买 nike

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

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

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

"-108508098"

发送功能的工作方式与我在其他地方使用它一样,并且它执行了它应该执行的操作。

最佳答案

在编辑之前,您的问题不仅在于 sprintf (顺便说一句,您不应该使用它,更喜欢 snprintf ),还在于 C 中的整数(它们的位数有限,例如在我的 Linux 上最多 64 位)桌面......;阅读 computer number formatC data types 上的维基页面)。

您对 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 这样的数字)。不要重新发明 bignum(它们很难有效地实现)。使用像 gmplib 这样的库

如果 64 位对你来说足够了(所以如果你的数字总是在 -263 之间,即 -9223372036854775808 和 263- 1 即 9223372036854775807),请考虑使用 long long (或 unsigned long long )数字 C99C11 :

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

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

不要忘记在编译时启用所有警告和调试信息(例如使用 gcc -Wall -Wextra -g ),然后学习如何使用调试器(例如 gdb )

关于c - sprintf 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31267300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com