gpt4 book ai didi

c - AIX 上 asprintf 的替代或变通方法

转载 作者:太空狗 更新时间:2023-10-29 16:39:28 34 4
gpt4 key购买 nike

我正在尝试在 AIX 上构建 python-kerberos。 kerberospw.c 使用对 asprintf 的调用,但根据 Google 告诉我的信息,asprintf 在 AIX 上不存在。

我看到了http://www.koders.com/c/fidAA9B130D588302673A28B568430A83131B7734C0.aspx?s=windows.h ,看起来我可以创建一个替代 asprintf,但我不知道它会去哪里或者我将如何#include 它在 kerberospw.c 中。

有没有一种方法可以使用 koders.com 示例或其他一些代码来“伪造”asprintf?我可以只包含 kerberospw.c 中所示的 asprintf 函数吗?我不是 C 程序员,但是

asprintf (char **resultp, const char *format, ...)

在我看来,末尾带有点的签名不像是有效签名。来自 kerberospw.c 的相关行如下

asprintf(&message, "%.*s: %.*s", (int) result_code_string.length,
(char *) result_code_string.data,
(int) result_string.length,
(char *) result_string.data);

我知道我可以联系 python-kerberos 的作者,但是 a) 我认为如果我这样做的话,获得一个潜在的补丁会很有帮助,并且 b) 我可能会遇到其他使用 asprintf 的软件,并且如果有解决方法就好了。

最佳答案

asprintfprintf 函数系列的一个变体,它分配一个缓冲区来保存格式化字符串的内存并返回它。它是一个参数数量可变的函数(因此声明中的 ... 是有效的 C 代码)。您可以找到描述 here .

如果 vsnprintf 正常运行(即,如果缓冲区太小而无法容纳格式化字符串,则返回错误),它可以相对容易地重新实现。

下面是这样一个实现:

#include <stdarg.h>

int asprintf(char **ret, const char *format, ...)
{
va_list ap;

*ret = NULL; /* Ensure value can be passed to free() */

va_start(ap, format);
int count = vsnprintf(NULL, 0, format, ap);
va_end(ap);

if (count >= 0)
{
char* buffer = malloc(count + 1);
if (buffer == NULL)
return -1;

va_start(ap, format);
count = vsnprintf(buffer, count + 1, format, ap);
va_end(ap);

if (count < 0)
{
free(buffer);
return count;
}
*ret = buffer;
}

return count;
}

关于c - AIX 上 asprintf 的替代或变通方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4899221/

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