Неясно, хотели ли вы просто «напечатать» вычисленное значение, заполненное справа от длины вашего ссылочного PI, или пытались ли вы создать новую строку, содержащую значение, равное нулю, к длине оригинала
Пока у вас есть два хороших ответа, смешивание двух (используя sprintf
из ответа Анри Переса) и использование длины ссылочной строки и memset
из ответа @ chux , Вы можете создать строку, содержащую вычисленное значение, дополненное до нуля нулями без , используя любые модификаторы ширины .
В ваших выходных данных кажется, что вы пытались создать этот результат в переменной pi
, на которую ссылается char*
во втором printf
утверждении.
Вы можете сделать это, используя sprintf
, чтобы записать вычисленное значение в массив, размер которого основан на вашей ссылке. (либо обычный массив с автоматическим типом хранения, если ваша ссылка является определенным литералом, либо VLA ( Массив переменной длины ), либо выделенный массив, если на вашу ссылку просто ссылается указатель).
Поскольку sprintf
возвращает количество записанных символов (исключая нулевой байт, используемый для завершения вывода строк), нет необходимости сканировать полученный буфер снова, используя strlen
. Вы можете просто написать, например, pi_ref_len - (chars written with sprintf)
нулей до конца заполненного вами массива на sprintf
, начиная со смещения (chars written with sprintf)
от начала вашего массива.
Короткий пример (бессовестный плагиат имен переменных, используемых @chux) может быть записан следующим образом:
#include <stdio.h>
#include <string.h>
#define PI_STR "3.1415926535" \
"8979323846264338327950288419716939937510582097494459230781640628620899"
int main (void) {
int pi_ref_len = (sizeof PI_STR) - 1,
written = 0;
char pi_calc_str[sizeof PI_STR] = "";
double pi_calc = 3.142025; /* presumably returned by some calculation */
/* write calculated value to str saving characters written */
written = sprintf (pi_calc_str, "%lf", pi_calc);
/* if written less than reference chars */
if (written < pi_ref_len) /* write that many zeros to end */
memset (pi_calc_str + written, '0', pi_ref_len - written);
printf ("ref: %s\nnew: %s\n", PI_STR, pi_calc_str);
}
Пример использования / Вывод
$ ./bin/pi_fill_zeros
ref: 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899
new: 3.14202500000000000000000000000000000000000000000000000000000000000000000000000000