gpt4 book ai didi

c - 使用 GlibC,Windows 中 _snscanf() 的模拟是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:59:24 31 4
gpt4 key购买 nike

我已经开始在 C 中查看 cURL 的示例。在编译 ftpuploadresume.c 时,我在以下位置收到 undefined reference 错误:

/* _snscanf() is Win32 specific */
r = _snscanf(ptr, size * nmemb, "Content-Length: %ld\n", &len);

我只想知道 glibc 的 _snscanf 的替代品是什么。

最佳答案

假设您使用空终止字符串,您可以完全安全地使用 sscanf() 而无需第二个(长度)参数。你也可以在 Windows 上。如果您不知道该字符串以 null 终止但您确实知道它有多长,请添加 null 终止符。 (如果您不知道字符串有多长,也不知道它是否以 null 结尾,没有是安全的!)

假设您有一个 C99 编译器,您可以自动进行必要的更改:

#define _snscanf(data, length, format, ...) scanf(data, format, __VA_ARGS__)

小心!

注意 comment通过 namey — 为此,谢谢。

查看 _snscanf() 上的 Microsoft 手册页.这些例子并不令人信服;即使没有指定长度,您也会得到相同的结果。但是,看起来@namey 总体上是正确的。很多将取决于它的使用环境。如果指定的 length 实际上是 strlen(data),那么差异并不重要。如果指定的长度比该长度长,则差异可能无关紧要。如果长度小于数据的长度,差异可能会很重要。

更好的覆盖函数可能是:

int _snscanf(const char *input, size_t length, const char *format, ...)
{
char *copy = malloc(length + 1);
if (copy == 0)
return 0;
memmove(copy, input, length);
copy[length] = '\0';
va_list args;
va_start(args, format);
int rc = vsscanf(copy, format, args);
va_end(args);
free(copy);
return rc;
}

关于c - 使用 GlibC,Windows 中 _snscanf() 的模拟是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9407590/

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