【问题标题】:printing multiple integers at the same time同时打印多个整数
【发布时间】:2013-04-29 03:07:52
【问题描述】:

我想知道是否有更好的方法在 c 中打印整数数组;

目前我为数组中的每个 int 执行 printf("%d" ,.. )

但是这会导致每个 int 进行一次系统调用? (如果我的理解是正确的)。

最好将 int 数组转换为字符串缓冲区,然后一次调用打印缓冲区。

如果需要,我可以为它编写代码。

第一季度。这是个好主意还是太麻烦而不值得?

第二季度。有没有实现这种东西的库。 (无论我用谷歌搜索什么,都会回到打印整数的初学者教程:s)

编辑 数组的大小事先不知道。

【问题讨论】:

  • printf("%d %d %d %d\n", arr[0], arr[1],arr[2]) 最多调用一次 write() 系统打电话给你担心。
  • @jimmcnamara 数组是动态大小的。所以不能以这种方式对其进行硬编码。我已经更新了问题。
  • 您询问的是如何解决“多个”系统调用场景。不是编程解决方法,IMO。
  • “如果我的理解是正确的”——10 次中有 9 次,当初学者这样说时,它是错误的。
  • @JimBalter 非常正确。

标签: c printf


【解决方案1】:

不,它不会导致每个int 进行一次系统调用,除非您将stdout 设置为无缓冲模式。这是 stdio 的重点:为您缓冲输出,因此您不必自己做。 printf 函数本身的额外调用开销非常少。如果您发现自己需要更高的性能,可以尝试以下方法:

for (i=0; i+4<=N; i+=4)
    printf("%d %d %d %d ", a[i], a[i+1], a[i+2], a[i+3]);
for (; i<N; i++)
    printf("%d ", a[i]);

【讨论】:

  • 如果它被缓冲了,我根本不需要担心:D。谢谢
【解决方案2】:

当您使用printf 时,输出已被缓冲。系统调用仅在您“刷新”缓冲区时进行 - 通过显式调用fflush(stdout) 或通过将\n 打印到控制台隐式调用。因此,应用程序端的预缓冲将使您的代码更加复杂,而不会带来任何实际的性能差异。

就帮助您将ints 写入字符串的库而言,您可以使用您已经在使用的相同&lt;stdio.h&gt;:分配一个足够大的缓冲区以容纳您的整数,改用sprintfprintf 写入它,然后用整个缓冲区的内容调用printf。如果您决定在输出中使用它们作为分隔符,这将帮助您避免在 \n 上刷新。

【讨论】:

  • 谢谢。如果它被缓冲,那么我想我可以使用 printf。虽然 sprintf 是个好主意。
  • @OsamaJaved sprintf 有用的唯一情况是,如果您想使用 \n 作为分隔符,并且您想写入关联的输出流使用控制台(无论如何,文件输出流都不会在\n 上刷新)。
  • 您已经省略了无缓冲的流——stdout 可以设置为无缓冲的,就像默认情况下的 stderr 一样。
  • @JimBalter 这是一个有趣的观察。可以通过一些环境配置参数使stdout 不受程序外部的缓冲吗?
  • 也许在某些实现中,但通常 stdio 将其设置为行缓冲或缓冲,具体取决于它是否是终端。
猜你喜欢
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多