C++中的各种进制转换函数汇总

我的格式有问题,建议看原创:https://blog.csdn.net/vir_lee/article/details/80645066

一,指定格式输出

 

1.在C中,按指定进制格式输出如下,


 
 
  1. printf( "%05o\n", 35);     //按八进制格式输出,保留5位高位补零
  2. printf( "%03d\n", 35);     //按十进制格式输出,保留3位高位补零
  3. printf( "%05x\n", 35);     //按十六进制格式输出,保留5位高位补零

2.在C++中,按指定进制格式输出如下,


 
 
  1. #include <bitset>
  2. #include<iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. cout << "35的8进制:" << std::oct << 35<< endl;
  7. cout << "35的10进制" << std::dec << 35 << endl;
  8. cout << "35的16进制:" << std::hex << 35 << endl;
  9. cout << "35的2进制: " << bitset<8>( 35) << endl;      //<8>:表示保留8位输出
  10. return 0;
  11. }

 

 

二,C/C++各种进制转换库函数

 

一)任意2-36进制数转化为10进制数。

建议自己写函数,代码如下:


 
 
  1. int Atoi(string s,int radix) //s是给定的radix进制字符串
  2. {
  3. int ans= 0;
  4. for( int i= 0;i<s.size();i++)
  5. {
  6. char t=s[i];
  7. if(t>= '0'&&t<= '9') ans=ans*radix+t- '0';
  8. else ans=ans*radix+t- 'a'+ 10;
  9. }
  10. return ans;
  11. }

    1.strtol()函数(百度百科

       函数原型:long int strtol(const char *nptr, char **endptr, int base)

 

    base是要转化的数的进制,非法字符会赋值给endptr,nptr是要转化的字符,例如:

 


 
 
  1. #include<cstdio>
  2. int main()
  3. {
  4. char buffer[ 20]= "10549stend#12";
  5. char *stop;
  6. int ans=strtol(buffer, &stop, 8);    //将八进制数1054转成十进制,后面均为非法字符
  7. printf( "%d\n",ans);
  8. printf( "%s\n", stop);
  9. return 0;
  10. }

 

输出结果:

556

9stend#12

 

 

注意:

    ①如果base为0,且字符串不是以0x(或者0X)开头,则按十进制进行转化。

 

 

    ②如果base为0或者16,并且字符串以0x(或者0X)开头,那么,x(或者X)被忽略,字符串按16进制转化。

    ③如果base不等于0和16,并且字符串以0x(或者0X)开头,那么x被视为非法字符。

 

    ④对于nptr指向的字符串,其开头和结尾处的空格被忽视,字符串中间的空格被视为非法字符。

 

二)将10进制数转换为任意的n进制数,结果为char型。

建议自己写,代码如下:


 
 
  1. string intToA(int n,int radix) //n是待转数字,radix是指定的进制
  2. {
  3. string ans= "";
  4. do{
  5. int t=n%radix;
  6. if(t>= 0&&t<= 9) ans+=t+ '0';
  7. else ans+=t -10+ 'a';
  8. n/=radix;
  9. } while(n!= 0); //使用do{}while()以防止输入为0的情况
  10. reverse(ans.begin(),ans.end());
  11. return ans;
  12. }

    1.itoa()函数(可以将一个10进制数转换为任意的2-36进制字符串)

 

       函数原型:char*itoa(int value,char*string,int radix);

 

 

例如:itoa(num, str, 2); num是一个int型的,是要转化的10进制数,str是转化结果,后面的值为目标进制。


 
 
  1. #include<cstdio>
  2. #include<cstdlib>
  3. int main()
  4. {
  5.      int num = 10;
  6.      char str[ 100];
  7.     _itoa(num, str, 2); //c++中一般用_itoa,用itoa也行,
  8.      printf( "%s\n", str);
  9.      return 0;
  10. }

2.sprintf()函数(可以将一个10进制数转换为指定格式的n进制字符串)

函数原型:int sprintf( char *buffer, const char *format, [ argument] … );


 
 
  1. #include<cstdio>
  2. int main()
  3. {
  4. char s[ 100]={ 0};
  5. sprintf(s, "%d", 123); //十进制输出产生"123"
  6. sprintf(s, "%4d%4d", 123, 4567); //指定宽度不足的左边补空格,产生:" 1234567"
  7. sprintf(s, "%8o", 123); //八进制输出,宽度占8个位置
  8. sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐
  9. sprintf(s, "%10.3f", 3.1415626); //产生:" 3.142"
  10. int i = 100;
  11. sprintf(s, "%.2f", i); //注意这是不对的
  12. sprintf(s, "%.2f", ( double)i); //要按照这种方式才行
  13. return 0;
  14. }

三)使用字符串流stringstream(头文件#include<sstream>)

 

    1.将八,十六进制转十进制。


 
 
  1. #include<iostream>
  2. #include<string>
  3. #include<sstream>
  4. using namespace std;
  5. int main(void)
  6. {
  7. string s= "20";
  8. int a;
  9. stringstream ss;
  10. ss<<hex<<s;     //以16进制读入流中
  11. ss>>a;         //10进制int型输出
  12. cout<<a<< endl;
  13.      return 0;
  14. }
  15. //输出:32

2.将十进制转八,十六进制。


 
 
  1. #include<cstdio>
  2. #include<iostream>
  3. #include<string>
  4. #include<sstream>
  5. using namespace std;
  6. int main(void)
  7. {
  8. string s1,s2;
  9. int a= 30;
  10. stringstream ss;
  11. ss<<oct<<a;      //10进制转成八进制读入流中,再以字符串输出
  12. ss>>s1;
  13. cout<<s1<< endl;         //输出:36
  14. ss.clear(); //不清空可能会出错。
  15. ss<<hex<<a; //10进制转成十六进制读入流中,,再以字符串输出
  16. ss>>s2;
  17. cout<<s2<< endl;         //输出:1e
  18. return 0;
  19. }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值