2013-04-29 5 views
5

Мне было интересно, есть ли лучший способ распечатать массив ints в c;печать нескольких целых чисел в одно и то же время

На данный момент я делаю printf("%d" ,..) для каждого int в моем массиве.

Однако это вызывает один системный вызов на int? (если мое понимание верное).

Было бы лучше преобразовать массив int в строковый буфер, а затем распечатать буфер за один вызов.

Я могу написать для этого код, если необходимо.

Q1. это хорошая идея или слишком много хлопот, чтобы стоить того?

Q2. Существуют ли библиотеки, которые реализуют такую ​​вещь. (Все, что я Google возвращается к начинающим учебники для печати целых чисел: s)

Редактировать Размер массива не известен заранее.

+0

Е ("% d% d% d% d \ п", обр [0], обр [1], обр [2]) делает один вызов write() - самое большее - системный вызов, о котором вы беспокоитесь. –

+0

массив @jimmcnamara имеет динамический размер, поэтому он не может жестко кодировать его таким образом. Я обновил вопрос. –

+0

Вы задавались вопросом об использовании сценария «множественных» системных вызовов. Не обходной путь программирования, ИМО. –

ответ

3

Когда вы используете printf, выход уже буферизирован. Системный вызов выполняется только тогда, когда вы «очищаете» буфер - либо явно, вызывая fflush(stdout), либо неявно, печатая \n на консоли. Поэтому предварительная буферизация на стороне приложения сделает ваш код более сложным, не предлагая никакой реальной разницы в производительности.

Насколько библиотека, чтобы помочь вам написать int с, чтобы строка идет, вы можете использовать один и тот же <stdio.h>, что вы уже используете: выделить буфер достаточно большой, чтобы держать ваши целые числа, используйте sprintf вместо printf написать он, а затем вызовите printf с содержимым всего буфера. Это поможет вам избежать промывки на \n, если вы решите использовать их в качестве разделителей на выходе.

+0

спасибо. Если он буферизирован, то, я думаю, я могу просто использовать printf. хотя sprintf - хорошая идея. –

+0

@OsamaJaved Единственный случай, когда 'sprintf' был бы полезен, если вы хотите использовать' \ n' в качестве разделителя * и *, который вы хотите записать в поток вывода, связанный с консолью (потоки вывода файлов не сбрасываются '\ n' в любом случае). – dasblinkenlight

+0

Вы опустили небуферизованные потоки - stdout можно сделать небуферизованным, как и stderr по умолчанию. –

3

Нет, это не вызывает одного системного вызова за 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]); 
+0

если его буферизовать, мне вообще не нужно беспокоиться: D. благодаря –

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