生成一个可变长度的空白字符数组

问题描述:

我将C代码连接到应该打印到屏幕上的代码(使用printf())乘法表,其中右下角(表格的最大乘积)作为MaxMult传递给函数。生成一个可变长度的空白字符数组

例如用于MaxMult = 4应该打印:

1 2 3 4 

    2 4 6 8 

    3 6 9 12 

    4 8 12 16 

的要求是,该表将被靠右对齐,而这就是我的问题:

每个号码,号码左边的白色空间是不同的。 ,因为我需要它遵循MaxMult左侧只有1个空白区域的要求,其他所有内容都参照它。

起初我想也许我可以传递一个变量给printf。像这样:

printf("% Num_Of_Wite_Space d", currNum) 

但我似乎无法做到这一点。

所以现在我需要一种方法来根据每个数字的位数生成一个不同长度的空白字符串,以便将IT传递给printf。 (希望我很清楚..)

有没有人可以告诉我如何做到这一点?

最简单的方法是对每个值使用固定的字段宽度,例如,

printf("%3d", a[i][j]); 

这将导致每个输出值与前导空格在必要时,得到的3场的宽度,例如被填充

1 2 3 4 

2 4 6 8 

3 6 9 12 

4 8 12 16 

显然,如果您需要使用两位以上的数字打印值,则应相应地增加字段宽度。

如果需要,将在运行时来决定,而不是固定在编译时你可以使用一个字段宽度:

printf("%*d", field_width, a[i][j]); 

进一步详情,请参阅man printf

+0

这不会对情况下工作时的最终(右下角)值大于2位数。 – unwind 2013-03-13 15:04:41

+0

@unwind:true - 它仅仅是这个特例的一个说明性示例 - 我已经更新了答案,但它涵盖了在运行时指定的不同字段宽度和字段宽度,而不是编译时。 – 2013-03-13 15:08:47

是这样的:

printf("% Num_Of_Wite_Space d", currNum)

,但我不能似乎能够做到这一点。

当然,你可以做到这一点。语法是:

printf("%*d", fieldWidth, currNum); 

请注意,fieldWidth是(空格+数字)的总宽度。

+0

谢谢保罗!我已经纠正了答案。 – 2013-03-13 15:37:38

这不是太困难:

int width = 10; //< number of chars in one column 
printf("%*d", width, a[i][j]); 

可以设置列宽固定,或从阵列使用某些计算值:

int width[COLS]; 
int a[ROWS][COLS]; 
int row, col; 

... // fill in a and width 

for (row = 0; row < ROWS; ++row) 
{ 
    for (col = 0; col < COLS; ++col) 
    { 
     printf("%*d", width[col], a[row][col]); 
    } 
    printf("\n"); 
}