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

时间:2023-03-03 16:28:02 买帖  | 投诉/举报

篇首语:本文由小编为大家整理,主要介绍了C++中的各种进制转换函数汇总及学习相关的知识,希望对你有一定的参考价值。

一.指定格式输出

1.C中指定格式输出

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

 2.C++中指定格式输出

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

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

1.任意2~36进制数转化为10进制

自己实现函数

int Atoint(string s,int radix)    //s是给定的radix进制字符串{    int ans=0;    for(int i=0;i<s.size();i++)    {        char t=s[i];        if(t>="0"&&t<="9") ans=ans*radix+t-"0";        else ans=ans*radix+t-"a"+10;    }        return ans;}

strol()函数:

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

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

例如:

#include<stdio.h>int main()  {      char a[20]="10549stend#12";      char *stop;      int ans=strtol(a, &stop, 8);   //将八进制数1054转成十进制,后面均为非法字符    printf("%d",ans);      printf("%s", stop);       return 0;}
//输出556

*注意:

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

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

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

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

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

自己实现函数

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

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

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

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

#include<stdio.h> #include<stdlib.h> int main()  {      int num = 10;      char str[100];      _itoa(num, str, 2);  //c++中一般用_itoa,用itoa也行,    printf("%s", str);      return 0;  }

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

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

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

三.使用字符串流string,stream

1)8,16->10

#include<iostream>#include<string>#include<sstream>using namespace std;int main(void){    string s="20";    int a;    stringstream ss;    ss<<hex<<s;    //以16进制读入流中    ss>>a;        //10进制int型输出    cout<<a<<endl;        return 0;}//输出:32

2)10->8,16

#include<cstdio>#include<iostream>#include<string>#include<sstream>using namespace std;int main(void){    string s1,s2;    int a=30;    stringstream ss;    ss<<oct<<a;        //10进制转成八进制读入流中,再以字符串输出    ss>>s1;                cout<<s1<<endl;        //输出:36    ss.clear();        //不清空可能会出错。    ss<<hex<<a;         //10进制转成十六进制读入流中,,再以字符串输出    ss>>s2;                cout<<s2<<endl;        //输出:1e    return 0;}

 


以上是关于C++中的各种进制转换函数汇总及学习的主要内容,如果未能解决你的问题,请参考以下文章