一直在刷题的时候,都会遇到一个坑,就是进制转换的问题。而每一次都傻乎乎的自己去实现一个。所以算是对以前的坑的一个总结。

  • itoa 函数

    • itoa是广泛应用的非标准C语言和C++语言扩展函数。由于它不是标准C/C++语言函数,所以不能在所有的编译器中使用。但是,大多数的编译器(如Windows上的)通常在<stdlib.h>/<cstdlib>头文件中包含这个函数。
      //函数原型
      char *itoa(int value, char *str, int radix) value 是被转换的整数
      str 转换后存储的字符数组
      radix 转换进制数,可以是 2, 8, 10, 16 等等

      由上可知,itoa可以实现10到2、8、16的转换,8到2、10、16的转换,16到2、8、10的转换,唯独没有2进制到其他进制的转换

    • 相关测试如下:
      #include<stdio.h>
      #include<stdlib.h>
      #include<string.h> int main()
      {
      char str[25]; memset(str, 0, sizeof(str));
      itoa(98, str, 2);
      printf("10--2进制: %s\n", str); memset(str, 0, sizeof(str));
      itoa(98, str, 8);
      printf("10--8进制: %s\n", str); memset(str, 0, sizeof(str));
      itoa(98, str, 16);
      printf("10--16进制: %s\n", str); memset(str, 0, sizeof(str));
      itoa(076, str, 2);
      printf("8--2进制: %s\n", str); memset(str, 0, sizeof(str));
      itoa(076, str, 10);
      printf("8--10进制: %s\n", str); memset(str, 0, sizeof(str));
      itoa(076, str, 16);
      printf("8--16进制: %s\n", str); memset(str, 0, sizeof(str));
      itoa(0xffff, str, 2);
      printf("16--2进制: %s\n", str); memset(str, 0, sizeof(str));
      itoa(0xffff, str, 8);
      printf("16--8进制: %s\n", str); memset(str, 0, sizeof(str));
      itoa(0xffff, str, 10);
      printf("16--10进制: %s\n", str);
      return 0;
      }

      程序运行结果如下:

  • sprintf 函数

    • 把格式化数据写入某个字符缓冲区中,头文件为<stdio.h>/<cstdio>
      //函数原型
      int sprintf(char *buffer, const char *format, [argument]...) buffer: char*型数组,指向将要写入的字符串的缓冲区
      format: 格式化字符串
      [argument]...: 可选参数,就是任何类型的数据

      sprintf可完成8,10,16进制间的互相转换。

    • 相关测试如下:
      #include<stdio.h>
      #include<string.h>
      #include<stdlib.h>
      int main(){
      char str[25]; memset(str, 0, sizeof(str));
      sprintf(str, "%o", 1024);
      printf("8进制: %s\n", str); memset(str, 0, sizeof(str));
      sprintf(str, "%x", 1024);
      printf("16进制: %s\n", str); return 0;
      }

      程序结果如下:

  • stoi, stol, stoll, stof, stod, stold

    • C++11新引入的string的api, 完成string向数值类型的转换

    • stoi:可实现任意进制数转10进制数,返回一个int数

      //函数原型
      int stoi(const string &str, size_t* idx = 0, int base = 10) str: 要转换的string
      idx: 为size_t*类型,是从str中解析出一个整数后的下一个字符的位置
      base: 指出string中要转换的数的进制,即str所代表的是个什么进制的数,如是base默认为10, 若base = 0, 表示由编译器自动判定str所代表的数的进制

      测试如下:

      #include<iostream>
      #include<string>
      using namespace std; int main(){
      string str_dec = "2048,hello world";
      string str_hex = "40c3";
      string str_bin = "-10010110001";
      string str_auto = "0x7f"; size_t sz; // alias of size_t
      int i_dec = std::stoi(str_dec, &sz);
      int i_hex = std::stoi(str_hex, nullptr, 16);
      int i_bin = std::stoi(str_bin, nullptr, 2);
      int i_auto = std::stoi(str_auto, nullptr, 0); std::cout << str_dec << ": " << i_dec << " and [" << str_dec.substr(sz) << "]\n";
      std::cout << str_hex << ": " << i_hex << '\n';
      std::cout << str_bin << ": " << i_bin << '\n';
      std::cout << str_auto << ": " << i_auto << '\n';
      }

      结果如下:

    • stod:将str转为double

      //函数原型
      double stod(const string &str, size_t *idx = 0) str: 要转换的string
      idex: 保存转换后的下一个字符位置

      测试如下:

      #include<iostream>
      #include<string>
      using namespace std; int main(){
      std::string orbits ("365.24 29.53");
      std::string::size_type sz; // alias of size_t double earth = std::stod (orbits,&sz);
      double moon = std::stod (orbits.substr(sz));
      std::cout << "The moon completes " << (earth/moon) << " orbits per Earth year.\n";
      return 0;
      }

      结果如下:

    • 其他函数可以根据这两个类推出来,不再赘述。

  • 总结:

    • stoi,stod等函数为C++11新加入,应该掌握
    • sprintf 功能略强大,值得研究注意
    • itoa 非标准库函数
    • 下一次,我不希望看到你再写跟进制转换相关的东西了,有现成的就该用。

C++中进制转换问题的更多相关文章

  1. Python中进制转换函数的使用

    Python中进制转换函数的使用 关于Python中几个进制转换的函数使用方法,做一个简单的使用方法的介绍,我们常用的进制转换函数常用的就是int()(其他进制转换到十进制).bin()(十进制转换到 ...

  2. python中进制转换

    使用Python内置函数:bin().oct().int().hex()可实现进制转换. 先看Python官方文档中对这几个内置函数的描述: bin(x)Convert an integer numb ...

  3. python 中进制转换及format(),int()函数用法

    python中数值型变量好像只能是十进制形式表示,其他类型变量只能以字符串形式存在,可以通过format函数将int类型变量转换成其他进制字符串,如下所示: v_code=15 # 2进制 x=for ...

  4. linux中进制转换

    方式一:使用$[]或$(()) 格式为:$[base#number]或$((base#number)),其中base为进制,number为对应进制数. 这种方式输入2进制.16进制等,但只能输出为10 ...

  5. .Net 之进制转换 余位补全

    十进制转二进制 Convert.ToString(n, 2) 其中 n -- 源类型 可以是shrot Byte Int Uint Long 2 -- 目标位 可以是2,8,10,16 同理十进制转1 ...

  6. jstack:将Process Explorer中看到的进程ID做16进制转换,到ThreadDump中加上0x 前缀即能找到对应线程(转)

    原文链接:http://www.iteye.com/topic/1133941 症状: 使用Eclipse win 64位版本,indigo及kepler都重现了,使用tomcat 6.0.39,jd ...

  7. java中Integer包装类的具体解说(java二进制操作,全部进制转换)

    程序猿都非常懒,你懂的! 今天为大家分享的是Integer这个包装类.在现实开发中,我们往往须要操作Integer,或者各种进制的转换等等.我今天就为大家具体解说一下Integer的使用吧.看代码: ...

  8. JavaSE教程-03Java中分支语句与四种进制转换

    一.分支语句 计算机源于生活,程序模拟现实生活,从而服务生活 行为模式 1,起床,刷牙,洗脸,吃早餐,上课,回家,睡觉(顺序性) 2,如果时间不太够,打个滴滴快车,如果时间够,坐个地铁(选择性) 3, ...

  9. Python中数字之间的进制转换

    Python中的数据转换 在python中可以通过内置方法进行相应的进制转换,但需记得转化成非十进制时,都会将数字转化成字符串 转化成二进制 a = 10 #声明数字,默认十进制 b = bin(a) ...

随机推荐

  1. ajax实现下载功能

    ajax实现下载功能 适用场景:由于点击按钮下载excel响应时间过长,此时间段加入加载样式(灰色层.加载动画): 浏览器弹出下载框后,上面的加载样式去掉.  方     法 :使用jquery.fi ...

  2. BZOJ 1096: [ZJOI2007]仓库建设(动态规划+斜率优化)

    第一次写斜率优化,发现其实也没啥难的,没打过就随便找了一份代码借(chao)鉴(xi)下,不要介意= = 题解实在是懒得写了,贴代码吧= = CODE: #include<cstdio># ...

  3. 从0移植uboot (二) _启动流程分析

    经过了上一篇的配置,我们已经执行make就可以编译出一个uboot.bin,但这还不够,首先,此时的uboot并不符合三星芯片对bootloader的格式要求,其次,此时的uboot.bin也没有结合 ...

  4. C语言的基本概念

    1.经典入门:hello world #include <stdio.h> int main(void) { printf("hello world.\n"); ; } ...

  5. Form表单中method="post/get'的区别

    Form提供了两种数据传输的方式--get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响.虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一 ...

  6. 基于react+react-router+redux+socket.io+koa开发一个聊天室

    最近练手开发了一个项目,是一个聊天室应用.项目虽不大,但是使用到了react, react-router, redux, socket.io,后端开发使用了koa,算是一个比较综合性的案例,很多概念和 ...

  7. Android消息推送 SDK 集成指南

    使用提示 本文是 Android SDK 标准的集成指南文档. 匹配的 SDK 版本为:r1.8.0及以后版本. 本文随SDK压缩包分发.在你看到本文时,可能当前的版本与本文已经不是很适配.所以建议关 ...

  8. wemall app商城源码中基于PHP的ThinkPHP惯例配置文件代码

    wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中 ...

  9. 服务器 ADO 错误:0x80004005,[DBNETLIB]

    2012-12-0310:44:06 ]ADO 错误:0x80004005,[DBNETLIB][ConnectionOpen(Connect()).]SQL Server 不存在或拒绝访问.[ 20 ...

  10. 1630/2023: [Usaco2005 Nov]Ant Counting 数蚂蚁

    2023: [Usaco2005 Nov]Ant Counting 数蚂蚁 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 85  Solved: 40[S ...