【问题标题】:Formatting string in CC中的格式化字符串
【发布时间】:2014-11-02 20:45:13
【问题描述】:

我想用 C 语言做类似的事情:

# This example is in Python language

var1 = 10
var2 = 45
var3 = 76

text = "Numbers are: %d, %d, %d." % (var1, var2, var3)

这在 C 中可能吗?我想说的是纯 C 的解决方案,而不是 C++。

编辑:

我不想直接打印字符串,我只想存储格式化字符串。

【问题讨论】:

  • 阅读 C 语言中的 array。[在这种情况下,只有 ints]
  • 打印变量是一个如此基本的功能,它只是必须在最简略的课程中都已涵盖。这表明你应该考虑从第一章开始重新开始你的教学书。

标签: python c arrays string string-formatting


【解决方案1】:

使用snprintf()

int var1 = 10;
int var2 = 45;
int var3 = 76;
char text[100];

snprintf(text, sizeof text, "Numbers are: %d, %d, %d.", var1, var2, var3);

【讨论】:

  • 在这种简单的情况下,您已经足够安全了,但通常您应该检查snprintf() 的返回,看看是否一切都合适。 int n; n = snprintf(text, sizeof(text), ...); if (n >= sizeof(text)) { /*ohcrap*/}
  • 通过良好控制printf()-ing,代码可以使用大小合适的缓冲区。 const char format [] = "Numbers are: %d, %d, %d."; char text[sizeof format + 3 * (sizeof(int)*CHAR_BITS/3 + 3)]; sprintf(text, format, var1, var2, var3);.
  • @chux, snprintf() 可以返回所需的确切字节数。 n = snprintf(NULL, 0, "Numbers are: %d, %d, %d.", var1, var2, var3); text = malloc(n + 1) /* I don't like VLAs; but your usage is ok */; snprintf(text, n + 1, "Numbers are: %d, %d, %d.", var1, var2, var3);
  • 同意snprintf() 可以返回所需的确切字节数,但随后需要 2 次调用。与许多编码任务一样,有许多好的方法。请注意,我的评论不使用 VLA,而是使用固定大小的缓冲区,例如您接受的答案。
  • 您对 VLA 的看法是正确的。我没有引起足够的重视。我很抱歉。
【解决方案2】:

最接近的实现是:

#include <stdio.h>

int main(void){
    char text[100];
    int var1 = 10;
    int var2 = 45;
    int var3 = 76;
    sprintf(text, "Numbers are : %d, %d, %d", var1, var2, var3);
}

【讨论】:

  • 是最好的答案,但是你的花括号弄错了......:P
  • 你忘了return 0;
  • @thohl 抱歉,这里还是初学者 :)
  • @CoolGuy 实际上,我没有。我会在没有伤害的情况下跳过一些东西。
【解决方案3】:

是的,在 C 中是可能的

int main()
{
int var1,var2,var3;
var1 = 10;
var2 = 45;
var3 = 76;
printf("Numbers are: %d %d %d", var1, var2, var3);
return 0;
}

将 format 指向的 C 字符串写入标准输出 (stdout)。如果 format 包含格式说明符(以 % 开头的子序列),则 format 后面的附加参数将被格式化并插入到结果字符串中,替换它们各自的说明符。 有关 printf() 的更多详细信息,您可以访问以下链接: 参考:http://www.cplusplus.com/reference/cstdio/printf/ C 也一样

【讨论】:

    猜你喜欢
    • 2013-07-09
    • 2021-05-09
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多