我的格式有问题,建议看原创:https://blog.csdn.net/vir_lee/article/details/80645066
一,指定格式输出
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++各种进制转换库函数
一)任意2-36进制数转化为10进制数。
建议自己写函数,代码如下:
-
int Atoi(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;
-
}
1.strtol()函数(百度百科)
函数原型:long int strtol(const char *nptr, char **endptr, int base)
base是要转化的数的进制,非法字符会赋值给endptr,nptr是要转化的字符,例如:
-
#include<cstdio>
-
int main()
-
{
-
char buffer[
20]=
"10549stend#12";
-
char *stop;
-
int ans=strtol(buffer, &stop,
8);
//将八进制数1054转成十进制,后面均为非法字符
-
printf(
"%d\n",ans);
-
printf(
"%s\n", stop);
-
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进制数,结果为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<cstdio>
-
#include<cstdlib>
-
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<cstdio>
-
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;
-
}
三)使用字符串流stringstream(头文件#include<sstream>)
1.将八,十六进制转十进制。
-
#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.将十进制转八,十六进制。
-
#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;
-
}