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) ...
随机推荐
- Top命名的一些简单用法
1. Top命令的显示 top 2. 按(Shift + O)是为了选择列进行排序.例如:按a是为了通过PID进行排序.然后按任意键返回主窗口. 3. 显示特定用户的进程. top -u hadoop ...
- typedef struct 是什么意思
typedef用于定义一种新类型例如定义了如下的结构typedef struct student{int age;int score;}STUDENT;那么则有STUDENT stu1;就相当于str ...
- [Kafka] - Kafka基本操作命令
Kafka支持的基本命令位于${KAFKA_HOME}/bin文件夹中,主要是kafka-topics.sh命令:Kafka命令参考页面: kafka-0.8.x-帮助文档 -1. 查看帮助信息 b ...
- Spring Mvc + Easyui中根据查询结果导出文件
项目是典型的SpringMvc + Easyui,需求是前台页面根据查询条件导出生成CSV文件. 基本流程是:前台页面通过表单提交的方式,请求后台,后台接受到查询参数,根据查询参数查询到数据集合,最后 ...
- linux c++ 加载动态库常用的三种方法
链接库时的搜索路径顺序:LD_LIBRARY_PATH --> /etc/ld.so.conf --> /lib,/usr/lib 方法1. vi .bash_profile 设置环 ...
- 《剑指offer》— JavaScript(21)栈的压入、弹出序列
栈的压入.弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5, ...
- 基于keepalived搭建MySQL高可用集群
MySQL的高可用方案一般有如下几种: keepalived+双主,MHA,MMM,Heartbeat+DRBD,PXC,Galera Cluster 比较常用的是keepalived+双主,MHA和 ...
- Google addword 策略
https://support.google.com/adwords/answer/1704392?hl=zh-Hans&authuser=0 顾客会用自己的思路去解决生意上的问题,想要拥有自 ...
- C# 字符串比较大小 string.Compare()方法
string.Compare方法,用来比较2个字符串值得大小 string.Compare(str1, str2, true); 返回值: 1 : str1大于str2 0 : str1等于str2 ...
- 【转】Spring注解
原文链接:http://bbs.51cto.com/thread-1136892-1.html 使用Spring2.5的新特性--Autowired可以实现快速的自动注入,而无需在xml文档里面添加b ...