【问题标题】:Output multiple lines of strings in C?在C中输出多行字符串?
【发布时间】:2021-02-11 09:01:12
【问题描述】:

我用过

while (cond) { ...
    printf("%d %d %d\n", i, j, k); ... }

我想要

while (cond) { ...
    arr.append("%d %d %d\n", i, j, k); ... }
printf("%s", arr);

在 C 中做类似的最佳实践是什么?

【问题讨论】:

  • 为什么不坚持第一个代码?
  • @ForceBru:更快。
  • 使用snprintf()存入缓冲区,最后一次打印缓冲区,
  • @Rainning - 你怎么知道它更快?你还没有测量两者。第一种方法可能会在每次迭代时写入标准输出,但第二种方法将涉及内存分配(甚至可能重新分配)。我不会冒险猜测哪个更快。
  • 第一个代码只涉及printf()。建议的解决方案涉及snprintf()malloc()realloc(),有时也包括printf(),最后是printf()。我敢打赌第一个代码更快。

标签: arrays c string


【解决方案1】:

您可以使用数组来存储组合输出并在最后打印,或者如果需要在中间步骤打印:

char arr[32768];
size_t size = sizeof(arr), pos = 0;
while (cond) { ...
    size_t len = snprintf(arr + pos, size - pos, "%d %d %d\n", i, j, k);
    if (pos + len >= size) {
        printf("%.*s", (int)pos, arr);
        pos = 0;
        len = snprintf(arr + pos, size - pos, "%d %d %d\n", i, j, k);
    }
    pos += len;
    ...
}
printf("%.*s", (int)pos, arr);

但是请注意,上面的代码模拟了printf 具有更大缓冲区的行为,并且可能仍然比直接调用printf 慢。您可以使用setvbuf() 控制流的缓冲区大小:

setvbuf(stdout, 32768, _IOFBF);

您可以尝试更大的缓冲区大小并对代码进行基准测试以评估对性能的任何影响。

【讨论】:

  • 性能说明:每次迭代都比printf慢。
【解决方案2】:
while (cond) { ...
    int i = printf("%d %d %d\n", i, j, k); 
    char *newstring = malloc(i + 1);
    /* some error checks */ 
    snprintf(newstring, i+1, "%d %d %d\n", i, j, k);
    arr.append(newstring); ... }

【讨论】:

  • arr.append 在 C 中?怎么样?
  • @SouravGhosh 等等 - 你会看到
  • 这不是关于我的快乐,而是关于编写有意义的代码。仅仅因为它可以做到,并不意味着它应该做到。我想这会造成更多的混乱,这是不必要的,很容易避免。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2012-06-13
  • 2022-01-08
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
相关资源
最近更新 更多