乘法表输出时根据结果位数添加动态空格的问题求助
问题描述
我尝试打印乘法表,希望在每个结果前根据结果的位数添加对应数量的空格,实现对齐效果。以下是我的实现代码:
#include <stdio.h> #define TEN 10 int len_num(int *num); int main(int argc, const char * argv[]) { int i,j; int space = 0; int multi; for(i = 1; i <= TEN; i++) { for(j=1; j <= TEN; j++) { multi = i * j; space = len_num(&multi); printf("%*d", space, i*j); } printf("\n"); } return 0; } int len_num(int *num) { int length = 0; while (*num != 0) { *num /= 10; length++; } return length; }
但空格并未显示,请问有什么解决建议?
问题分析与解决建议
1. 核心逻辑错误:%*d的使用方式不对
你想要的是让所有数字对齐,本质是让每个数字占据固定宽度(比如10×10=100是3位,所有数字都占3位,位数不足的前面补空格)。但当前代码中,space是当前数字的位数,%*d会把输出宽度设为等于数字位数,数字刚好填满宽度,自然不会有空格。
2. 辅助函数len_num的问题
该函数通过指针修改了传入的multi变量(*num /=10会把原数逐步变为0),虽然你后面用i*j输出没影响结果,但这种修改输入参数的写法很危险,容易引发其他bug。计算数字长度时,应该复制原数进行计算,避免修改原始值。
修正后的代码
#include <stdio.h> #define TEN 10 // 计算数字的位数,不修改原数 int len_num(int num) { if (num == 0) return 1; int length = 0; int temp = num; // 复制原数进行计算 while (temp != 0) { temp /= 10; length++; } return length; } int main(int argc, const char * argv[]) { int i,j; // 动态计算乘法表中最大数的位数 int max_len = len_num(TEN * TEN); for(i = 1; i <= TEN; i++) { for(j=1; j <= TEN; j++) { int multi = i * j; // 用最大位数作为输出宽度,自动在前面补空格对齐 printf("%*d", max_len, multi); // 若需要数字间更明显的间隔,可改为:printf("%*d ", max_len, multi); } printf("\n"); } return 0; }
关键修改点
- 把
len_num的参数改成值传递,用临时变量计算位数,避免修改原变量。 - 提前计算乘法表中最大数的位数,用这个值作为
%*d的宽度参数,所有数字会按该宽度右对齐,位数不足的自动补空格。 - 若希望数字间间隔更清晰,可在
printf中添加一个空格。
内容的提问来源于stack exchange,提问作者IrrationalName
相关产品推荐
相关产品推荐

