【问题标题】:How do you build strings concatenated with int variables in C?如何在 C 中构建与 int 变量连接的字符串?
【发布时间】:2020-09-29 07:12:43
【问题描述】:

C 中的字符串操作不是我习惯的,来自更高级别的语言。在这种情况下,我希望能够创建fooN 形式的字符串,其中 N 是表示数字的变量。在 Java 中,它看起来像

for (int N = 0; N < 5; n++) {
    System.out.println("foo"+N);
}

哪个会输出

foo0
foo1
foo2
foo3
foo4

但是,我不知道在 C 中实现这一点的直接方法。我可能会在我制作 char[] 的地方破解一些东西并弄清楚如何填充它,但我的想法并没有显得优雅。有没有一种简单的方法可以让 C 语言连接字符串和 int 变量?

谢谢

【问题讨论】:

  • 查找sprintf。类似于String.format
  • printf("foo%d", N);
  • 首先您需要决定是制作字符串,还是只显示字符串。您的 Java 示例将两者混为一谈(您在显示它之前创建了一个字符串,因为语法很容易)。但在 C 中,创建字符串和显示字符串是完全不同的任务。

标签: c string concatenation string-concatenation


【解决方案1】:

有没有一种简单的方法可以让 C 语言允许连接字符串和 int 变量?

是的,使用s*printf()。诀窍是内存管理。

  1. 使用固定大小的缓冲区。

    // Coarse calculation of maximum memory needed to string-ify an int
    #define INT_STRING_MAX (sizeof(int)*CHAR_BIT/3 + 3)
    #define FOO_SZ (3 + INT_STRING_MAX)
    
    char buf[FOO_SZ];
    sprintf(buf, "foo%d", n);
    println(buf);
    
  2. 分配内存。可以使用snprintf(NULL, 0, ... 来计算内存需求。

    int sz = snprintf(NULL, 0, "foo%d", n);
    char *buf = malloc(sz + 1);
    if (buf) {
      sprintf(buf, "foo%d", n);
      println(buf);
      free(buf);
    }
    
  3. 使用snprintf() 估计和检查内存需求。

    // Assume 64-bit or narrower int and so needs at most 21 bytes
    #define FOO_SZ (3 + 21)
    
    char buf[FOO_SZ];
    int cnt = snprintf(buf, sizeof buf, "foo%d", n);
    if (cnt >= 0 && (unsigned) cnt < sizeof buf) {
      println(buf);
    } else {
      // wrong estimate
    }
    

最佳选择取决于您想要的简单、高效和便携程度。

【讨论】:

  • 请注意,对于健壮的代码,您还应该检查 sz &gt; 0 ,因为 snprintf 可能会失败并返回负错误代码。我听说在输入包含无效 UTF-8 的 UTF-8 语言环境等情况下会发生这种情况。 (如果输入可以超过INT_MAX,这个方法也不起作用)
  • @MM 都是真的。并且更多的麻烦应该需要字符串超过SIZE_MAX。使用不同的locales,所有的赌注也都取消了。检测特定故障的唯一问题是一旦发现如何处理它们。 IMO,知道这往往会推动设计。对于此时此地 - 一些基础知识。
猜你喜欢
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 2016-07-23
  • 1970-01-01
相关资源
最近更新 更多