【发布时间】:2019-06-07 13:02:59
【问题描述】:
我相信我可能过于复杂了,并在这里搜索了许多解决方案。
这是C 代码,用于在命令行中编写双数输入流,例如“10 1 666 10000 666 77 88 3 5 9”,默认为13 个小数位 (prec) 和默认 3 列 (cols),因此输出实际上是
10.0000000000000 1.0000000000000 666.0000000000000
10000.0000000000000 666.0000000000000 77.0000000000000
88.0000000000000 3.0000000000000 5.0000000000000
9.0000000000000
分 3 列。 (所有输入的数字必须不超过 10,000)。
我基本上需要我的输出数据看起来像这样(每列后最多 2 个空格):
5163.1575670644243 6806.8180791650138 8977.2739646595655
2598.0792870876185 7162.5237586596268 6691.2041993469038
1043.6422009949033 6922.8216193121125 3.0480056154058
9926.6081118198181 100.3082369457076 5135.1567125461588
7808.2382885219886 1439.6542863246559 249.6179692983795
214.0065309610279 9280.5883968626968 2687.3871883297220
7612.8426770836513 6644.2027649769589 8364.5604419080173
4740.7550279244360 254.6181218909269 2500.3814813684498
2293.6803491317482 835.3306680501725 5962.7923215430155
9622.5988341929387 57.3069246498001 1557.9630726035341
8398.5614795373385 5958.4870143742182 2568.3835566270945
9935.9135715811644 3410.1040681173131 982.0299691763055
8393.5613269447913 9066.2766808069100 4896.4546037171549
7597.8422193060087 8551.5661488692895 1076.6432081057162
1911.3635059663686 7586.8418836024048 9282.8936429944770
4696.1433149204995 1388.0423596911528 1936.3642689291055
3408.4091921750542 3556.4137089144565 9241.8923917355878
5003.4578691976685 3366.7130954924160 4270.1303140354621
620.6292916653950 4700.7538071840572 1766.0538956877347
441.6238288521989 8153.8591875972779
这是我的代码。您可以简单地通过 gcc 编译 .c 文件并运行 .exe 并在其间输入带有空格的 # 以使其输出(格式化):
#include <stdio.h> // scanf(), fscanf(), fprintf(), fopen()
#include <stdlib.h> // atoi(), getenv()
int main(int argc, char *argv[])
{
int cols = 3; // default value for columns is 3.
int prec = 13; // default value for precision is 13 decimal places.
int count = 0; // keep track of length of input stream, i.e. "10 55 13 666 77" has length 5.
double x;
// Get a command line argument (if it exists) to set precision. If it's not there, do nothing and just use default precision (13)
if (argc > 1)
{ // get an operand from the command line
prec = atoi(argv[1]);
cols = atoi(argv[2]);
}
// User gets prompted to enter input
printf("Enter input stream numbers: \n");
// While loop spits output and formats it
while (scanf("%lf", &x) != EOF)
{
// Asterisk(*) keeps precision for dynamic. Default value for precision is 13.
printf("%19.*f", prec, x);
count++;
// When count == cols, \n is output to format columns
if (count == cols)
{
printf("\n");
count = 0;
}
}
return 0;
}
我目前将列宽固定为 19,但有消息告诉我它必须是星号 *,因此它可以是动态的。只要我有不同大小的 # 作为输入,它们就不会在每列之后始终保持 2 个空格。
我想我应该重新分配我的双 x;这是我对 char x[] 数组的输入,但我想如果我问可能会有更简单的实现。我有一种预感,这与每列的前导空格#有关。
由于我使用的是 scanf(),有没有办法计算我的 # 的每个字符?比如如果我的第一个数字是 10.0000000000000,有没有办法计算每个位置,所以我可以总计(在这种情况下)一个 int 值 = 15,这样我就可以动态填充每个数字?
如果我需要更具体,请告诉我。
【问题讨论】:
-
您可以忽略 // 获取命令行参数(如果存在)来设置精度。如果它不存在,什么也不做,只使用默认精度 (13),这对于这个问题真的不重要。
-
这完全取决于你想要什么,但如果所有数字都是正数(它们在示例中),那么你需要在三列中的每一列中找到最大的数字,并做一个试验格式那个数字。这会告诉你它有多宽。从那里开始,这只是一个生成合适的格式字符串并忽略编译器对
printf()的非文字格式字符串的警告的问题。目前尚不清楚“默认的 13 位小数”是什么意思。您的初始示例显示所有数字的小数点后有 13 个零。 'default 3 before' 很简单。 -
注意:
scanf("%lf", &x) != EOF不会捕获匹配失败,最好是while (scanf("%lf", &x) == 1) -
@DavidC.Rankin 谢谢,我会用它来代替。