2013-07-04 3 views
1

Я хочу напечатать элементы массива, используя один printf. Массив невелик (например, до 10 элементов), но каждый раз мне придется печатать различное количество первых элементов массива.Печать (часть) массива в одном printf в C

Я знаю, что могу это сделать:

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 выполненных одновременно разными нитями, я полагаю.

Я могу написать огромный переключатель для обработки всех возможных случаев, но он уродлив.

Любые другие предложения?

+1

Вы можете сконфигурировать свой вывод и отобразить его в конце – Alexis

+3

«Но это может привести к чередованию выходов нескольких printf, выполняемых в то же время разными потоками, я полагаю». - да, и было бы иначе, если бы вы использовали только один вызов. Управление потоками игнорирует функциональные границы вызовов. –

+1

Если цель очень проста, например, для ведения журнала, вы можете распечатать thread-id с элементом массива для отслеживания – VoidPointer

ответ

7

Одним из раствора является использование Sprintf

Соберите все выходные в одном из полукокса буфера и напечатать всю строку только один раз.

Вы можете выделить буфер динамически ...

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); 
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); 

Конечно, это может быть отрегулировано не переполнения буфера, если есть риск, но 10 числа в 1,024 символов должно быть довольно безопасно ,

1

Вы можете использовать некоторый тип синхронизации потоков (если вы используете pthreads, вы можете взглянуть на мьютексы). Затем поток получает блокировку непосредственно перед выходным циклом и освобождает блокировку после.

Если в цикле есть вычисление, это может привести к проблемам с производительностью, поскольку потокам придется ждать друг друга. Если вы просто выводите массив, я не ожидаю каких-либо недостатков в производительности по сравнению с решением sprintf.

Смежные вопросы