printf跟随零到一定程度

时间:2018-11-02 01:55:49

标签: c printf

我正在尝试将零打印到一定长度,以与存储为字符串的另一个数字进行比较,我想知道该怎么做?

编辑:添加了示例代码
例如:

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 :(得分:2)

  

我如何使实际的计算在字符串的末尾填充零?

代码可以尝试各种数字方法,例如

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

答案 1 :(得分:1)

目前尚不清楚您是只想“打印”填充到参考PI长度右侧的计算值,还是要创建一个新的字符串,其值填充为原始PI长度的零?

虽然您有两个不错的答案,但二者融合在一起(使用Aneury Perez的答案中的sprintf),并使用了参考字符串的长度和@chux的答案中的memset ,您可以使用任何 width修饰符创建一个字符串,其中包含您的计算值,该字符串的末尾用零填充

在输出中,您似乎试图在第二条pi语句中引用为char*的{​​{1}}变量中创建该结果。

您可以使用printf来完成此操作,将计算出的值写入根据您的引用确定大小的数组。 (如果您的引用是已定义的文字,则为具有自动存储类型的普通数组,如果您的引用只是由指针引用,则为VLA(可变长度数组)或分配的数组)。

由于sprintf返回写入的字符数(不包括用于结束字符串输出的空字节),因此无需使用sprintf再次扫描结果缓冲区。然后,您可以简单地写,例如strlen从您的数组开始处的偏移量pi_ref_len - (chars written with sprintf)开始,以零{{}}填充到由sprintf填充的数组的结尾。

一个简短的示例(毫不客气地抄袭@chux使用的变量名)可以写成如下:

(chars written with sprintf)

使用/输出示例

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

答案 2 :(得分:0)

也许这会对您有所帮助。在评论结果中,也许有更好的解决方案,但这可行。在printf中,将%016 更改为您的 max_buffer长度 或首选范围,并且不要忘记在%后添加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);