1. 程式人生 > >C++中的各種進制轉換函數匯總及學習

C++中的各種進制轉換函數匯總及學習

對齊 中間 表示 lse base oct nbsp dpt bit

一.指定格式輸出

1.C中指定格式輸出

printf("%05o\n",35);    //按八進制格式輸出,保留5位高位補零
printf("%03d\n",35);    //按十進制格式輸出,保留3位高位補零
printf("%05x\n",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\n",ans);  
    printf("%s\n", 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\n", 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++中的各種進制轉換函數匯總及學習