列中打印数字时如何避免打印垃圾?

How to avoid printing junk when printing numbers in columns?

本文关键字:打印 何避免 数字      更新时间:2023-10-16

此代码从文件中获取所有数字,并根据条件将它们分成三列。每个数字可以出现在一列或多列中。

while(!feof(fp)) {
i++;
fscanf(fp,"%d", &b);
if(b%2==0) {
arr[j]=b;
j++;
}
if(b%2==1) {
arr2[jj]=b;
jj++;
}else if(i>b){
printf(" ");
}

if(b%5==0) {
arr3[jjj]=b;
jjj++;
}else if(i>b){
printf(" ");
}
}
while(a < j || a < jj || a < jjj){
printf("       %3d           %3d             %3d n", arr[a],arr2[a],arr3[a]);
a++;

它像这样输出它们:

Even:           Odd:        Divisible by 5:
10            3               10
20            7               20
22           13               30
24           21               -234455 
26           29               0
30           344208           2056

它输出末尾以外的垃圾(地址(数字。我试过了,但我无法清理它们。

想法?

您将遇到的一件事是,可被 5 整除的数字可能比偶数或奇数少。

我建议在打印前确保 a 小于相应的最大数组数。 如果没有,也许可以打印一个制表符或空格。

清理输出的一种方法是有条件地进行打印。这样,您就不能使用一个printf语句打印所有三个数字,而必须单独打印:

while(a < j || a < jj || a < jjj)
{
if (a < j)
printf("  %3d  ", arr[a]);
else
printf("  %3s  ", "");
if (a < jj)
printf("  %3d  ", arr2[a]);
else
printf("  %3s  ", "");
if (a < jjj)
printf("  %3d  ", arr3[a]);
else
printf("  %3s  ", "");
putchar('n');
a++;
}

在这里,我使用%3s和空字符串来确保空字段与数字很好地对齐。你可以打印一堆空格,但你必须仔细编辑你的代码,以确保有正确数量的空格。


可以将条件打印的逻辑填充到printf的格式说明符中,并使用一个语句完成所有打印,但这会使代码更难理解和修改。像这样:

bool is_valid1 = (a < j);
int int_field1 = is_valid1 ? 3 : 0;
int int_value1 = is_valid1 ? arr[j] : 0;
int str_field1 = 3 - int_field1;
bool is_valid2 = (a < jj);
int int_field2 = is_valid2 ? 3 : 0;
int int_value2 = is_valid2 ? arr2[jj] : 0;
int str_field2 = 3 - int_field2;
bool is_valid3 = (a < jjj);
int int_field3 = is_valid3 ? 3 : 0;
int int_value3 = is_valid3 ? arr3[jjj] : 0;
int str_field3 = 3 - int_field3;
printf("  %*.d%*s   %*.d%*s   %*.d%*sn",
int_field1, int_value1, str_field1, "",
int_field2, int_value2, str_field2, "",
int_field3, int_value3, str_field3, "");

在这里,%*.d格式说明符告诉printf,我的整数字段的宽度是要printf的参数。我计算它是 3(如果整数有效(或 0(如果它无效(。点.告诉它,如果字段的宽度为 0,则不打印任何内容。