我正在尝试将零打印到一定长度,以与存储为字符串的另一个数字进行比较,我想知道该怎么做?
编辑:添加了示例代码
例如:
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
我如何使实际的计算在字符串的末尾填充零?
答案 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);