C/C++进制转换和输出格式

C/C++进制转换和输出格式

输出格式

1、输出保留多少有效位数

#include <iostream>
#include <iomanip>   //设置必备的头文件
using namespace std;
int main()
{
    
    
	// 指定保留多少位小数
	double s=12.345;
	cout<<setiosflags(ios::fixed)<<setprecision(2);
	cout<<s<<endl;   //输出12.35
	float pi=3.14159;
	cout<<pi<<endl;   //输出3.14

	//C语言的输出方式
	long float num = 123.456;
	int n = 2;
	printf_s("%5.1f",num); //输出总位数**至少**5位(小数点算一位),1位小数(四舍五入)
	printf_s("%3.2f",num); //输出总数至少3位,其中数字总共2位,这里输出 02
	return 0;
}

2、指定进制格式输出


#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位输出

	printf("%05o\n",35);    //按八进制格式输出,保留5位高位补零
	printf("%03d\n",35);    //按十进制格式输出,保留3位高位补零
	printf("%05x\n",35);    //按十六进制格式输出,保留5位高位补零
    return 0;  
}

进制转换库函数

1、strtol()函数

函数原型:long int strtol(const char *nptr, char **endptr, int base)
base是要转化的数的进制,非法字符会赋值给endptr,nptr是要转化的字符。

①如果base为0,且字符串不是以0x(或者0X)开头,则按十进制进行转化。
②如果base为0或者16,并且字符串以0x(或者0X)开头,那么,x(或者X)被忽略,字符串按16进制转化。
③如果base不等于0和16,并且字符串以0x(或者0X)开头,那么x被视为非法字符。
④对于nptr指向的字符串,其开头和结尾处的空格被忽视,字符串中间的空格被视为非法字符。


#include<cstdio>
int main()  
{
    
      
    char buffer[20]="10549stend#12";  
    char *stop;  
    // 将buffer中有效的8进制数转化为十进制数
    // stop储存不合法的字符
    int ans=strtol(buffer, &stop, 8);   //将八进制数1054转成十进制,后面均为非法字符
    printf("%d\n",ans);  
    printf("%s\n", stop);   
    return 0;
}

十进制转其他,输出类型为char

1、itoa()

// 自己写的
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;	
}

C/C++自带的itoa()例子


#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、sprinf()


#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)

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

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

大数的十六、八进制相互转换

这里一定要注意到,十六、八、二进制是相对应的

string HtoO(string H_list)
{
    
    
	string Map[16] = {
    
     "0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111" };
	string B_num = "";
	string eight = "";
	// 转化为二进制
	int len = H_list.length();
	for (int i = 0; i < len; i++)
	{
    
    
		if (H_list[i] - '0' > 9)
			B_num += Map[H_list[i] - '0' - 7];
		else
			B_num += Map[H_list[i] - '0'];
	}
	// 去头部的0
	int i = 0;
	while (B_num[i] == '0') //头部有i个0
		i++; 
	len = B_num.length() - i;
	int remain = len % 3;
	int tem = 0;
	if (remain > 0)
	{
    
    
		for (int j = i; j < i + remain; j++)
		{
    
    
			tem = tem * 2;
			tem += B_num[j] - '0';
		}
		eight += tem + '0';
	}

	for (int j = i + remain; j <i + len; j = j + 3)
	{
    
    
		tem = (B_num[j] - '0') * 4 + (B_num[j + 1] - '0') * 2 + (B_num[j + 2] - '0') * 1;
		eight += tem + '0';
	}
	if (eight.size() == 0)
		return "0";
	return eight;
}

猜你喜欢

转载自blog.csdn.net/qq_39117858/article/details/104184779
今日推荐