C程序设计语言第二版习题3-5

简介: 编写函数itob(n, s, b) ,用于把整数n转换成以b为基数的字符串并存到字符串s中。例如, itob(n, s, 16) 表示将n转换成16进制数,并存入s中。

问题描述

编写函数itob(n, s, b) ,用于把整数n转换成以b为基数的字符串并存到字符串s中。例如, itob(n, s, 16) 表示将n转换成16进制数,并存入s中。

问题分解

  • 主函数main
  • 工具函数reverse(s) ,用来逆置字符串
  • 核心函数 itob(n, s, b)。这道题其实也是习题3-4的一个引申了,我们先来回顾3-4 的itoa函数的实现:
void itoa(int n, char s[])
{
    int sign, i;
    sign = n;
    i = 0;
    do {
        s[i++] = ((sign < 0) ?-(n % 10) : n % 10) + '0'; //负数对10求余仍然是负数
    } while ((n /= 10) != 0);
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    reverse(s);
}

我们知道10进制整数转换成b进制的算法是: 不断用 n 对b进行求余,直到商为0,那么每次求余的结果,从后往前组合一起就是对应的b进制数。因此,itoa 可以看做把整数n转换成10进制数的itob特例,即此时b = 10, 由此我们可以假设itob的实现为:

void itob(int n, char s[], int b)
{
    int sign, i;
    sign = n;
    i = 0;
    do {
        s[i++] = ((sign < 0) ?-(n % b) : n % b) + '0'; //负数对10求余仍然是负数
    } while ((n /= b) != 0);
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    reverse(s);
}

我们检验一下,当b = 2,8,10 时都是满足的,唯独b = 16时会出个问题,因为n % 16 的结果有可能大于9,大于9的时候应该使用字母表示,而不是数字了,因此我们要针对b=16情况做个改进,改进后的代码请看如下代码实现。

代码实现

#include<stdio.h>
​
void itob(int n, char s[], int b);
void reverse(char s[]);
​
int main()
{
        int n = (~0U >> 1) + 1, b = 16;
        char s[100];
        printf("The input number is: %d\n", n);
        itob(n, s, b);
        printf("The output string is: %s\n", s);
        return 0;
}
​
void itob(int n, char s[], int b)
{
    int sign, i, temp;
    sign = n;
    i = 0;
    do {
      temp = sign < 0 ?  -(n % b) : n % b;
      if(temp > 9){
        s[i++] = temp - 10 + 'a';
      }else{
        s[i++] = temp + '0';
      }
    } while ((n /= b) != 0);
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    reverse(s);
}
​
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;
    }
}

编译运行

image

由运行结果可看出,原方法得到的结果不是预期的,改造后的得到了正确的结果。

目录
相关文章
|
机器学习/深度学习 自然语言处理 算法
未来语音交互新纪元:FunAudioLLM技术揭秘与深度评测
人类自古以来便致力于研究自身并尝试模仿,早在2000多年前的《列子·汤问》中,便记载了巧匠们创造出能言善舞的类人机器人的传说。
13188 116
|
存储 关系型数据库 MySQL
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
2517 0
|
安全 Java 数据库
使用`Class.forName`动态加载类
使用`Class.forName`动态加载类
|
机器学习/深度学习 传感器 编解码
基于matlab实现16个调频脉冲信号的产生、脉冲压缩、MTI、MTD、CFAR等信号处理算法
基于matlab实现16个调频脉冲信号的产生、脉冲压缩、MTI、MTD、CFAR等信号处理算法
|
SQL 安全 数据库
掌握SQL:数据库操作与查询的精髓
一、引言 在数据驱动的时代,数据库是任何组织或项目不可或缺的一部分
|
安全 网络安全 数据安全/隐私保护
数字堡垒之下:网络安全漏洞、加密技术与安全意识的三重奏
在数字化浪潮不断推进的当下,网络安全已成为维护信息资产不可或缺的盾牌。本文深入探讨网络安全中的薄弱环节—漏洞的存在与影响,剖析加密技术如何在数据保护中扮演关键角色,并强调培养良好的安全意识对于防范潜在网络威胁的重要性。通过具体案例分析和数据统计,文章旨在为读者提供一个关于如何构建更为坚固的数字防线的全面视角。
68 1
|
Oracle 关系型数据库 MySQL
深入OceanBase内部机制:多租户架构下的资源隔离实现精讲
深入OceanBase内部机制:多租户架构下的资源隔离实现精讲
|
SQL 数据可视化 算法
R语言公交地铁路线进出站数据挖掘网络图可视化
R语言公交地铁路线进出站数据挖掘网络图可视化
|
JavaScript
Vue将Element Plus 进行自定义封装
Vue将Element Plus 进行自定义封装
313 0
|
Ubuntu 网络协议 Linux
Linux操作系统实验十 Linux网络及服务配置(一)
Linux操作系统实验十 Linux网络及服务配置
647 0