C++中的各種進制轉換函數匯總及學習
阿新 • • 發佈:2018-11-13
對齊 中間 表示 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++中的各種進制轉換函數匯總及學習