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

  • 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. scala IDE错误:..is cross-compiled with incompatible version....

    下午scala工程出现如下错误: 搜索这个问题,没有找到答案. 直接去官网查看http://scala-ide.org/docs/current-user-doc/faq/index.html,发现了 ...

  2. iOS 手机摇一摇功能

    调用手机摇一摇功能其实很简单,在你调用的控制器的 viewDidLoad方法里调用 [UIApplication sharedApplication].applicationSupportsShake ...

  3. 各种ORM框架对比(理论篇,欢迎来观摩)

    各种ORM框架对比 目前框架有以下 PetaPoco Dapper.NET Massive Simple.Data Chain PetaPoco 轻量级,以前单文件,目前有维护形成项目级别,适合多个数 ...

  4. MONO 如何打包 .NET程序独立运行(winform篇)

    .NET程序独立运行是指运行.NET的电脑上,不需要安装.NET框架. .NET程序集“独立运行”并非真正的独立,它是运行在mono运行时基础之上的.由于这个运行时可以独立存在,所以,我们不需要在目标 ...

  5. 关于rem的使用和less编译工具考拉

    前提: 1.使用rem的前提是首先要设置好页面的根节点的大小: <script> (function(){ var html = document.documentElement; var ...

  6. 微信小程序,超能装的实例教程

    序言 开始开发应用号之前,先看看官方公布的「小程序」教程吧!(以下内容来自微信官方公布的「小程序」开发指南) 本文档将带你一步步创建完成一个微信小程序,并可以在手机上体验该小程序的实际效果.这个小程序 ...

  7. 连连看的原生JS实现

    那天闲来无事,便想找个小游戏来打发时间,后来便找到了连连看, 玩了一会儿感觉无聊,想到各位高手用JS做的各种小游戏,便想自己也来做一个,于是便有了这几天的成果. 代码是用 原生JS 实现的,只是用来学 ...

  8. 精通gulp常用插件

    本文主要展示的是gulp常用插件的使用方法和用途,通过对插件的熟练运用达到精通gulp.不定期更新.可以到github上面下载DEMO. github地址:lin-xin/gulp-plugins 匹 ...

  9. HttpHeplp 公共类 HttpWebRequest

    public class HttpHelp { public CookieContainer CookieContainer { get; set; } public CookieCollection ...

  10. 3385: [Usaco2004 Nov]Lake Counting 数池塘

    3385: [Usaco2004 Nov]Lake Counting 数池塘 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 22  Solved: 21 ...