我是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/

    10-12 23:59