C/C++学习笔记

C++ 十六进制、八进制与十进制之间的转换

2020-04-19  本文已影响0人  零岁的我

懒得写了,详情看注释啦。
实验代码

#include<iostream>
#include<cmath>
#include<string>
#include<sstream>
#include<iomanip> 
using namespace std;

int hex2dec(string hexstr)
{
    int num=0;
    int len=hexstr.length();
    for(int i=len-1;i>1;--i){
        if(hexstr[i]>='0' && hexstr[i]<='9'){
            num+=(hexstr[i]-'0')*pow(16,len-i-1);
        }
        else if(hexstr[i]>='A' && hexstr[i]<='F'){
            num+=(hexstr[i]-'A'+10)*pow(16,len-i-1);
        }
        else if(hexstr[i]>='a' && hexstr[i]<='f'){
            num+=(hexstr[i]-'a'+10)*pow(16,len-i-1);
        }
        else{
            return -1;
        }    
    }
    return num;
}
/*使用stringstream处理进制转换问题
<sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。
1.stringstream::str(); returns a string object with a copy of the current contents of the stream.
2.stringstream::str (const string& s); sets s as the contents of the stream, discarding any previous contents.
3.stringstream清空,stringstream s; s.str("");
*/
//十六进制字符串转十进制数字
int hex2dec1(string hexstr)
{
    int decn;
    stringstream ss;
    ss.str(hexstr);
    ss>>hex>>decn;
    return decn;
}

//八进制字符串转十进制数字
int oct2dec(string octstr)
{
    int decn;
    stringstream ss;
    ss.str(octstr);
    ss>>oct>>decn;
    return decn;
}

//十进制数字转十六进字符串
string dec2hex(int decn)
{
    stringstream ss;
    // ss<<hex<<decn;
    // ss<<"0x"<<hex<<decn;
    //使用输出流操作算子制定输出格式
    /*
    1. setw(w):指定输出宽度为w个字符;
    2. setfill(c):在指定宽度下,输出字符不足时用c填充,默认空格填充;
    3. uppercase:十六进制数中使用 A~E。若输出前缀,则前缀输出'0X',科学计数法中输出E.
    */
    ss<<uppercase<<"0x"<<setfill('0')<<setw(4)<<hex<<decn;
    string hexstr=ss.str();
    return hexstr;
}

//十进制转八进制字符串
string dec2oct(int decn)
{
    stringstream ss;
    ss<<oct<<decn;
    string octstr=ss.str();
    return octstr;
}

int main(int argc,char **argv)
{
    // string hexstr;
    // while(getline(cin,hexstr)){
    //     int n=hex2dec(hexstr);
    //     if(n==-1) break;
    //     cout<<n<<endl;

    //     int m=hex2dec1(hexstr);
    //     cout<<m<<endl;
    // }

    string hexstr;
    int decn;
    string octstr;

    cout<<"--------十六进制转十进制---------"<<endl;
    cout<<"请输入一个十六进制整数('0x/0X'开头):";
    cin>>hexstr;
    decn=hex2dec(hexstr);
    cout<<"对应的十进制整数为:"<<decn<<endl;

    cout<<"---------八进制转十进制---------"<<endl;
    cout<<"请输入一个八进制整数('0'开头):";
    cin>>octstr;
    decn=oct2dec(octstr);
    cout<<"对应的十进制整数为:"<<decn<<endl;


    cout<<"--------十进制转十六进制---------"<<endl;
    cout<<"请输入一个十进制整数:";
    cin>>decn;
    hexstr=dec2hex(decn);
    cout<<"对应的十六进制数为:"<<hexstr<<endl;

    cout<<"--------十进制转八进制----------"<<endl;
    cout<<"请输入一个十进制整数:";
    cin>>decn;
    octstr=dec2oct(decn);
    cout<<"对应的八进制数为:"<<octstr<<endl;
    
    return 0;
}
实验截图

注意:C++中输入八进制数必须以数字0开头。
有关stringstream的详细使用可以参考链接:http://www.cplusplus.com/reference/sstream/stringstream/

上一篇下一篇

猜你喜欢

热点阅读