【发布时间】:2019-03-20 16:16:41
【问题描述】:
我正在学习 C 和一个将整数转换为字符串的基本示例(您在其他语言中认为这是理所当然的)。我找到的答案是这样的:
sprintf(str, "%d", num);
但我想看看这是如何实现的。所以我查了一下sprintf,它把我带到了这里:
#define vsprintf(s, f, a) _IO_vsprintf (s, f, a)
int
__sprintf (char *s, const char *format, ...)
{
va_list arg;
int done;
va_start (arg, format);
done = vsprintf (s, format, arg);
va_end (arg);
return done;
}
然后我查找 _IO_vsprintf 并显示:
int
__IO_vsprintf (char *string, const char *format, va_list args)
{
_IO_strfile sf;
int ret;
#ifdef _IO_MTSAFE_IO
sf._sbf._f._lock = NULL;
#endif
_IO_no_init (&sf._sbf._f, _IO_USER_LOCK, -1, NULL, NULL);
_IO_JUMPS (&sf._sbf) = &_IO_str_jumps;
_IO_str_init_static_internal (&sf, string, -1, string);
ret = _IO_vfprintf (&sf._sbf._f, format, args);
_IO_putc_unlocked ('\0', &sf._sbf._f);
return ret;
}
这似乎围绕_IO_vfprintf 展开。但我在code 中找不到那个位置。谷歌和 GitHub 没有带来任何结果。想知道是否有人提供了 sprintf 的完整实现,如果没有,可以解释它是如何工作的。
我想知道如何像 sprintf 那样实现 itoa,这听起来是一个很好的实现。
如果没有实现,我对这段代码如何实际运行感到困惑。
【问题讨论】:
-
寻找
vfprintf。 -
那么
vfprintf字符串对应的int是什么。 -
vfprintf导致__nldbl_vfprintf也导致空白。其实可能this. -
无论如何,如果你想要一个
itoa功能,xprintf是一个严重的矫枉过正。有一个strtol家族的表现比这些家族中的任何一个都好。 -
取决于“缓冲区溢出问题”的含义。从某种意义上说,C 总体上存在“缓冲区溢出问题”。