gpt4 book ai didi

c - 更好的 sprintf?

转载 作者:IT王子 更新时间:2023-10-29 00:32:20 26 4
gpt4 key购买 nike

我是 C 的新手。最近我一直在研究一个系统,该系统通过套接字、MQSeries 和其他途径从许多其他系统获取输入。基本上,我的工作是将这些不同的源放在一起,并将它们放入一种自己开发的类似 XML 的格式中,然后将它们存储在适当的数据库中,或者将它们传递到其他系统。因此,我一直都在创建格式化字符串。。非常简单,它们看起来像这样:

"<tag>lotsa string data</tag>...repeat ad ad nauseam"

所以我开始使用 sprintfvsprintf 很容易制定一个例程来将 sprintf 的格式字符串连接在一起,但问题是我没有高级知道我收到的字符串的长度,所以很难知道要分配的缓冲区的大小。我得到的字符串可以是 25 字节长或 250k 字节。不说了。所以我当然会溢出缓冲区一两次。这导致我使用 snprintf,这没问题,但只是在它们被截断时将责任推回给我重新分配缓冲区并重试。

所以我知道这不是宇宙中最大的问题,我可以自己将长度加起来,但是有没有办法在 C 中使这个更容易一些,或者我应该停止提示并找出某种递归函数提前将所有字符串长度相加?

最佳答案

就像很多事情一样,你之前的某个人发牢骚,然后挠痒痒。 asprintf and vasprintf救援。它们并没有比 sprintf 做得更多,但是它们确切地做的是困扰您的事情,即计算出需要多少空间然后分配它、格式化字符串并将其传回给你。

一些注意事项:

  • 如果出现问题,它们将返回 -1,否则返回字符串的长度

  • 确实需要记住在用完后释放字符串。

  • 它们不是 C 或 POSIX 的一部分,因此您的平台可能没有它们。

  • 由于您使用的是 linux,因此它们可用,但您需要定义 _GNU_SOURCE 功能宏

一个半荒唐的例子:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>

void doSomething(char *str)
{
printf("%s\n", str);
}

int main(int argc, char *argv[])
{
char *opentag = "bold";
char *str1 = "first string ";
char *str2 = "second string ";
char *str3 = "third string ";
char *closetag = "/bold";
char *output_string;

asprintf(&output_string, "<%s>%s%s%s<%s>", opentag, str1, str2, str3, closetag);

doSomething(output_string);

free(output_string);

return(0);
}

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

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