You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

乘法表输出时根据结果位数添加动态空格的问题求助

问题描述

我尝试打印乘法表,希望在每个结果前根据结果的位数添加对应数量的空格,实现对齐效果。以下是我的实现代码:

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:57:32