jjzjj

c - 更好的 sprintf?

coder 2023-06-20 原文

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

有关c - 更好的 sprintf?的更多相关文章

  1. ruby-on-rails - 更好的替代方法 try( :output). try( :data). try( :name)? - 2

    “输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  2. ruby-on-rails - 使用 ruby​​ 将多个实例变量转换为散列的更好方法? - 2

    我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。

  3. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  4. Ruby:如何在 sprintf 输出中包含 % 符号? - 2

    我有:sprintf("%02X"%13)哪些输出:=>"OD"我希望我的输出是:=>"%0D"我试过:sprintf("\%%02X"%13)但我得到一个错误警告:格式字符串的参数过多。这同样适用于:sprintf("%%02X"%13)是否可以单独在sprintf中添加前导%? 最佳答案 文字%必须转义为%%:sprintf('%%')#=>"%"此外,您应该使用sprintf或%,而不是两者:sprintf('%%%02X',13)#=>"%0D"#^#commahere'%%%02X'%13#=>"%0D"#^#percen

  5. ruby-on-rails - Rails Asset Pipeline 更好的错误或堆栈跟踪 - 2

    刚刚将应用程序从rails3.0.9升级到3.2.1,当我运行bundleexecrakeassets:precompile时出现错误,这很好,但是回溯没有告诉我在哪里语法问题来self的css或scss文件。我尝试对“0ee5c0e69c92af0”进行greping,但该字符串没有出现在我的项目中。bundleexecrakeassets:precompile:allRAILS_ENV=productionRAILS_GROUPS=assets--trace**Invokeassets:precompile:all(first_time)**Executeassets:precom

  6. ruby-on-rails - 对于 Ruby 应用程序,是否有比 Sanitize 更好的替代方案? - 2

    我爱Sanitize.这是一个了不起的实用程序。我遇到的唯一问题是,它需要永远准备一个开发环境,因为它使用Nokogiri,这对编译时间来说是一种痛苦。是否有任何程序可以在不使用Nokogiri的情况下执行Sanitize的操作(如果没有别的,只是温和地执行它的操作)?这将以指数方式提供帮助! 最佳答案 Rails有自己的SanitizeHelper。根据http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html,它将Thissanitizehe

  7. Ruby:从模块中将多个方法作为 proc 返回的更好方法 - 2

    从模块中返回一个类似proc的方法非常容易:moduleFoodefself.bar#Methodimplementationenddefself.baz#Methodimplementationenddefself.qux#Methodimplemenatationenddefself.zoo#MethodimplementationendendFoo.method(:bar)#Returnsaprocobject但是如果我想从同一个模块返回多个(但不是全部)方法怎么办?一种方法是:[:bar,:baz].inject([]){|memo,i|memo有没有更好、更敏捷的方法来做同样

  8. ruby-on-rails - 更好的写法 @instances.count > 0 - 2

    我有这个代码:0%>#@statesisanactiverecordcollection我只是觉得应该有更好的方式来写这个。我正在寻找类似的东西:我意识到这是一个微小的变化,但它会是一个受欢迎的清理。 最佳答案 您可能需要ActiveRecord的any?http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-any-3FDostuffhereif@stateshasatleastoneresult 关

  9. ruby-on-rails - 在调用方法之前检查 nil 对象的更好方法是什么? - 2

    我有这个方法调用,我必须使用...financial_document.assets.length但是financial_document.assets可能是nil。我可以用...financial_document.assets.nil??'0':financial_document.assets.length有没有重复性较低的方法? 最佳答案 DaveW.Smith的方向是正确的。检查一下:http://www.nach-vorne.de/2007/4/24/attr_accessor-on-steroids一个简单的解决方案如

  10. ruby - 在 object.initialize 中,使用 self 是不是更好。超过 @? - 2

    有一种约定,在可能的情况下,通过对象的实例变量来引用对象的属性。PracticalObject-OrientedDesigninRuby说:Alwayswrapinstancevariablesinaccessormethodsinsteadofdirectlyreferringtovariables...这显示了一个例子,我已经释义了:classGearattr_reader:chainring,:cog...defratio#thisisbad#@chainring/@cog.to_f#thisisgoodchainring/cog.to_fend我看到使用实例变量创建新对象的最常

随机推荐