《C程序设计语言》练习 3-6

本文介绍了一个增强版的itoa函数实现,该函数能够接受一个额外的参数来定义转换后的字符串最小宽度,并在必要时自动在左侧填充空格以达到指定的宽度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

练习 3-6
修改 itoa 函数,使得该函数可以接收三个参数。其中,第三个参数为最小
字段宽度。为了保证转换后所得的结果至少具有第三个参数指定的最小宽度,在必要时应在
所得结果的左边填充一定的空格。


加的代码不多,其实想清楚了就是两个循环
x是传进来的指定宽度
i是字符串s中‘\0’的下标

x--; //指定宽度的最后一位下标
    if (i < x)
    {
        //先将数据后移
        while (i >=0)
                s[x--] = s[i--];
        //再补空格
        while (x >= 0)
            s[x--] = ' ';

其实可以变成一个循环,但感觉2个循环比较清晰


完整函数 :


void itoa(int n, char s[], int x)
{
    int sign, i;
    sign = n;
    i = 0;

    do {
        if (sign < 0)
            s[i++] = -(n % 10) + '0';
        else
            s[i++] = n % 10 + '0';

    } while ((n /= 10) != 0);
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    reverse(s);


    //-----------------------------------
    x--; //指定宽度的最后一位下标
    if (i < x)
    {
        //先将数据后移
        while (i >=0)
                s[x--] = s[i--];
        //再补空格
        while (x >= 0)
            s[x--] = ' ';
    }
}

完整代码 :

/*练习 3-6 修改 itoa 函数,使得该函数可以接收三个参数。其中,第三个参数为最小
字段宽度。为了保证转换后所得的结果至少具有第三个参数指定的最小宽度,在必要时应在
所得结果的左边填充一定的空格。
*/

#include <stdio.h>




void itoa(int n, char s[], int x);
void reverse(char s[]);
main()
{
    int n, x;
    n = (~0U >> 1) + 1; //int 最小值
    x = 20;
    char s[1024];
    itoa(n, s, x);
    printf("%s\n", s);
}

void itoa(int n, char s[], int x)
{
    int sign, i;
    sign = n;
    i = 0;

    do {
        if (sign < 0)
            s[i++] = -(n % 10) + '0';
        else
            s[i++] = n % 10 + '0';

    } while ((n /= 10) != 0);
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    reverse(s);


    //-----------------------------------
    x--; //指定宽度的最后一位下标
    if (i < x)
    {
        //先将数据后移
        while (i >=0)
                s[x--] = s[i--];
        //再补空格
        while (x >= 0)
            s[x--] = ' ';
    }
}


void reverse(char s[])
{
    int i, j, c;
    for (j = 0; s[j] != '\0'; j++)
        ;
    for (i = 0, j--; i < j; i++, j--)
    {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值