C++中进制转换问题
一直在刷题的时候,都会遇到一个坑,就是进制转换的问题。而每一次都傻乎乎的自己去实现一个。所以算是对以前的坑的一个总结。
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;
}
程序运行结果如下:

- itoa是广泛应用的非标准C语言和C++语言扩展函数。由于它不是标准C/C++语言函数,所以不能在所有的编译器中使用。但是,大多数的编译器(如Windows上的)通常在<stdlib.h>/<cstdlib>头文件中包含这个函数。
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;
}
程序结果如下:

- 把格式化数据写入某个字符缓冲区中,头文件为<stdio.h>/<cstdio>
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++中进制转换问题的更多相关文章
- Python中进制转换函数的使用
Python中进制转换函数的使用 关于Python中几个进制转换的函数使用方法,做一个简单的使用方法的介绍,我们常用的进制转换函数常用的就是int()(其他进制转换到十进制).bin()(十进制转换到 ...
- python中进制转换
使用Python内置函数:bin().oct().int().hex()可实现进制转换. 先看Python官方文档中对这几个内置函数的描述: bin(x)Convert an integer numb ...
- python 中进制转换及format(),int()函数用法
python中数值型变量好像只能是十进制形式表示,其他类型变量只能以字符串形式存在,可以通过format函数将int类型变量转换成其他进制字符串,如下所示: v_code=15 # 2进制 x=for ...
- linux中进制转换
方式一:使用$[]或$(()) 格式为:$[base#number]或$((base#number)),其中base为进制,number为对应进制数. 这种方式输入2进制.16进制等,但只能输出为10 ...
- .Net 之进制转换 余位补全
十进制转二进制 Convert.ToString(n, 2) 其中 n -- 源类型 可以是shrot Byte Int Uint Long 2 -- 目标位 可以是2,8,10,16 同理十进制转1 ...
- jstack:将Process Explorer中看到的进程ID做16进制转换,到ThreadDump中加上0x 前缀即能找到对应线程(转)
原文链接:http://www.iteye.com/topic/1133941 症状: 使用Eclipse win 64位版本,indigo及kepler都重现了,使用tomcat 6.0.39,jd ...
- java中Integer包装类的具体解说(java二进制操作,全部进制转换)
程序猿都非常懒,你懂的! 今天为大家分享的是Integer这个包装类.在现实开发中,我们往往须要操作Integer,或者各种进制的转换等等.我今天就为大家具体解说一下Integer的使用吧.看代码: ...
- JavaSE教程-03Java中分支语句与四种进制转换
一.分支语句 计算机源于生活,程序模拟现实生活,从而服务生活 行为模式 1,起床,刷牙,洗脸,吃早餐,上课,回家,睡觉(顺序性) 2,如果时间不太够,打个滴滴快车,如果时间够,坐个地铁(选择性) 3, ...
- Python中数字之间的进制转换
Python中的数据转换 在python中可以通过内置方法进行相应的进制转换,但需记得转化成非十进制时,都会将数字转化成字符串 转化成二进制 a = 10 #声明数字,默认十进制 b = bin(a) ...
随机推荐
- 连载《一个程序猿的生命周期》-《发展篇》 - 7.是什么阻碍了"程序猿"的发展?
有两件事想记录一下,具有普遍性和代表性."程序猿"加了引号,是泛指一类人,也并非局限于IT行业. 山东子公司的总经理是公司大股东之一,个子不高.有些秃顶.面容显老,但看 ...
- WPF 多语言解决方案 - Multilingual App Toolkit
1.首先安装Multilingual App Toolkit 2.新建项目,在VS中点击"工具" -> "Multilingual App Toolkit&qu ...
- jsp的九大内置对象和四个作用域
request 请求对象 类型 javax.servlet.ServletRequest 作用域 Request response ...
- java 抽象(abstract) 构造 静态(static) 总结--2017-03-02
抽象类:不能实例化!子类继承抽象类, 实例化子类对象才可以调用, 多态的体现; 抽象方法:必须被重写才能被调用; 静态方法:类名直接调用,或者实例化对象调用; 构造方法:new后面的括号里面带参数,就 ...
- javaSE复习总结
之前匆匆忙忙学完了java,后来又接着学习ee,然而,越是想要快一点最后反而会更慢一点.因为匆忙间 我几乎什么都没学会.在后面的学习中实在非常吃力.就把javase 的视频大部分又重新看了一遍.真的收 ...
- 项目架构开发:数据访问层之Logger
接上文 项目架构开发:数据访问层之Cache 本章我们继续ILogger的开发 ILogger.cs public interface ILogger { void Info(object messa ...
- Filebeat issue 排查--single.go:140: ERR Connecting error publishing events (retrying): dial tcp ****:5044: i/o timeout
我个人用docker搭建了一套日志分析平台:ELK+Filebeat 在正常跑了半个多月之后,Kibana刷新日志时突然发现日志不在更新了,停在某个时刻,就再也没有新log. 首先我查看了elk,lo ...
- 1059: [ZJOI2007]矩阵游戏
1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2154 Solved: 1053[Submit][Stat ...
- Java向上转型的意义
比如我这个程序 public class Testjava{ public static void main(String args[]) { fun(new Student()); fun(new ...
- TypeScript设计模式之组合、享元
看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...