C++進制轉換函數


一、指定格式輸出

1.在C中,按指定進制格式輸出如下:

printf("%05o\n",35);    //按八進制格式輸出,保留5位高位補零
printf("%03d\n",35);    //按十進制格式輸出,保留3位高位補零
printf("%05x\n",35);    //按十六進制格式輸出,保留5位高位補零
/*
00043
035
00035
*/

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;
}
/*

35的8進制:43
35的10進制35
35的16進制:23
35的2進制: 00100011

*/

 

二、C/C++各種進制轉換庫函數

一)任意2-36進制數轉化為10進制數

int Atoi(string s,int 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;
}

1.  strtol()函數

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

base是要轉化的數的進制,非法字符會賦值給endptr,nptr是要轉化的字符

#include <bitset>
#include<iostream>
using namespace std;
int main()
{
    char buffer[20]="10549stend#12";
    char *stop;
    int ans=strtol(buffer,&stop,8);  //將八進制1054轉成十進制,后面均為非法字符
    cout<<ans<<endl;
    cout<<stop<<endl;
    return 0;
}
/*
556
9stend#12
*/

注意:

①如果base為0,且字符串不是以0x(或者0X)開頭,則按照十進制進行轉化。

②如果base為0或者16,並且字符串以0X(或者0x)開頭,則x(或者X)被忽略,字符串按16進制轉化。

③如果base不等於0和16,並且字符串以0x(或者0X)開頭,則x被視為非法字符。

④對於nptr指向的字符串,其開頭和結尾的空格被忽略,字符串中間的空格被視為非法字符。

 

二)將10進制數轉換為任意的n進制數,結果為字符串類型

注意:std::reverse() 被定義在algorithm頭文件中

#include <algorithm>
string intToA(int n,int 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<cstdio> 
#include<cstdlib> 
int main()  
{  
    int num = 10;  
    char str[100];  
    _itoa(num, str, 2);  //c++中一般用_itoa,用itoa也行,
    printf("%s\n", str);  
    return 0;  
}

 

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

1.將八,十六進制轉十進制(string轉int)

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

2.將十進制轉八,十六進制(int轉string)

#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
   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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM