一、指定格式輸出
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; }