printf следующие нули в определенной степени - PullRequest
0 голосов
/ 02 ноября 2018

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

Редактировать: добавлен пример кода
Например:

printf("%s\n", "References:\n3.141592653"
    "58979323846264338327950288419716939937510582097494459230781640628620899");
printf("Monte Carlo: %d nodes over %d iterations calculated Pi as:\n%1.9f\n", numnodes, 
    final_iters,pi);    //Print the calculated value of pi

Выход

References:
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899
Monte Carlo 16 nodes over 160000 iterations calculated Pi as:
3.142025000

Как сделать так, чтобы фактические вычисления заполняли нулями до конца строки?

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Как сделать так, чтобы фактические вычисления заполняли нулями до конца строки?

Код может пытаться использовать различные числовые подходы, такие как

printf("%1.9f%071d\n", pi, 0); // Print an extra int 0 with wide width padded with '0'
printf("%1.80f\n", pi);        // Print with wide precision - (might not all be 0's)

И все же я волнуюсь, что спецификаторы с большой шириной / точностью и числовые спецификаторы могут нарушить реализацию printf(). поэтому я добавлю текстовый подход.

#define PI_STR "3.1415926535" \
    "8979323846264338327950288419716939937510582097494459230781640628620899"
printf("%s\n", "References:\n" PI_STR);

// Remember length of reference pi string
int pi_ref_len = (sizeof PI_STR)  - 1;

...
// Print computed pi & return count of characters printed
int pi_compute_len = printf("%1.9f", pi);

// Use a loop or print a portion of a string "0000...000"
char zeros[sizeof PI_STR];
memset(zeros, '0', sizeof zeros);
//        v--- %s w/precision can print a non-null character terminated char array
printf("%.*s\n", pi_ref_len - pi_compute_len, zeros);
0 голосов
/ 02 ноября 2018

Неясно, хотели ли вы просто «напечатать» вычисленное значение, заполненное справа от длины вашего ссылочного 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
0 голосов
/ 02 ноября 2018

Может быть, это поможет вам. в комментарии результат, возможно, есть лучшее решение, но это работает. в printf значение % 016 должно быть изменено на max_buffer length или предпочтительный диапазон и не забудьте добавить 0 после%.

printf("%016f\n\n",3.142025000); //// 000000003.142025


 ///3.14159000000000000000000000000
 #define MAX_BUFFER 32
float pi = 3.141592653;
char digit[MAX_BUFFER]={'\0'};
sprintf(digit, "%f", pi);
int l = strlen(digit);
int dif = MAX_BUFFER-l;
 for(int i=0;i<dif;i++)
 {
     digit[i+l-1]='0';
 }
 printf("%s", digit);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...