在C中的一个printf中打印(部分)数组

时间:2013-07-04 09:43:24

标签: c printf

我想使用单printf打印数组元素。数组很小(例如最多10个元素),但每次我可能需要打印不同数量的第一个数组元素。

我知道我可以这样做:

count = how_many_first_elements_i_need_this_time();
printf("array elements: ");
for (i = 0; i < count; ++i)
    printf("%d ", array[i]);
printf("\n");

但是,这可能导致交错输出由不同线程同时执行的几个printf

我可以编写巨大的开关来处理所有可能的情况,但它很难看。

还有其他建议吗?

3 个答案:

答案 0 :(得分:7)

其中一个解决方案是使用sprintf

将所有输出收集到一个char缓冲区中,并仅打印整个字符串一次。

您可以动态分配缓冲区......

char *pcBuf;
int iLen = 0;
count = how_many_initial_elements_i_need_this_time();
printf("array elements: ");

pcBuf = malloc((count * MAX_SIZE_OF_NUM) + count +1); //+count is required for space, and 1 is required for NULL

for (i = 0; i < count; ++i)
    iLen += sprintf(pcBuf+iLen, "%d ", array[i]);

printf("%s \n", pcBuf);

答案 1 :(得分:2)

printf()没有格式说明符可以自动打印数组的多个元素(%s除外,但是它会拉伸它)。

所以,你需要保持循环。

为了使每个线程的输出更具原子性(我不确定它是否保证每个printf() 真正原子)你可以在字符串缓冲区中构建输出,然后将其打印出来马上。

这样做的一种方法是在循环中使用sprintf()

char out[1024], *put = out;

for(i =0; i < count; ++i)
  put += sprintf(put, "%d ", array[i]);
strcat(put, "\n"); /* Fast! */
printf(out);

当然,如果存在风险,可以将其调整为不缓冲溢出,但1,024个字符中的10个整数应该是非常安全的。

答案 2 :(得分:1)

您可以使用某种类型的线程同步(如果您使用pthread,则可以查看互斥锁)。然后,线程在输出循环之前获取一个锁,并在之后释放锁。

如果循环中有计算,这可能会导致性能问题,因为线程必须等待彼此。如果您只是输出一个数组,那么与sprintf解决方案相比,我认为没有任何性能劣势。