2017년 5월 15일 월요일

C++ 형변환,정수 진법변환 모음


#include "stdafx.h"
#include "iostream"//C++ 콘솔 입출력
#include "stdlib.h"//동적할당
#include "math.h"//계산함수
#include "atlstr.h"//CString
#include "string"//string

using namespace std;
#pragma warning(disable:4996)
#pragma warning(disable:4244)

char* intConverter(char* number,int size, int K, int TARGET_K);
char* decTobi(int number);
char* decTohd(int number);

int _tmain(int argc, _TCHAR* argv[])
{
 //itoa 사용법 (int to char[](2,10,16) 진법 )
 int number=15;
 char target[10];//반드시 정적배열로 선언(포인터 선언 X)
 //char* target=(char*)malloc(sizeof(char)*10); //해도 됨.
 cout <<"진법변환 + 정수형을 문자열로// 대상 숫자 : "<<number<<"(2,10,16)"<<endl;
 cout <<itoa(number,target,2)<<endl;
 cout <<itoa(number,target,10)<<endl;
 cout <<itoa(number,target,16)<<endl;

 cout <<endl;
 //char[] to int 
 char number_2[]="147";
 cout <<"char 형을 int 형으로, 대상 숫자 : "<<number_2<<endl;
 cout << atoi(number_2)<<endl;

 cout <<endl;
 //char* to char[]
 char* charpointer="char* to char[]";
 char chararray[20];
 cout <<"char* 형을 char[] 형으로, 대상 문자열 : "<<charpointer<<endl;
 cout <<strcpy(chararray,charpointer)<<endl;

 //CString to char*
 char Buffer[255];
 CString szString("CString to char");
 size_t CharactersConverted = 0;
 wcstombs_s(&CharactersConverted, Buffer, szString.GetLength()+1, szString, _TRUNCATE);
 cout <<Buffer<<endl;

 //char* to CString, CString cout 출력법
 CString x1;
 char* x2="char* to CString";
 x1=(LPSTR)x2;
 cout <<CStringA(x1).GetString()<<endl;//CString 을 cout 로 출력

 //CString to int 
 CString cstringnumber("1442");
 int x=_ttoi(cstringnumber);
 cout <<x<<endl;
 
 //int to CString, CString cout 출력법
 int integernumber=142;
 CString numberstring;
 numberstring.Format(_T("%d"),integernumber);
 cout <<CStringA(numberstring).GetString()<<endl;//CString 을 cout 로 출력

 cout <<endl<<"진법변환"<<endl;
 //진법변환(2,10,16)

 char* binary_number="10110";
 char* decimal_number="271";
 char* hexadecimal_number="D7";

 cout << intConverter(binary_number,5,2,10)<<endl;
 cout << intConverter(binary_number,5,2,16)<<endl;

 cout << intConverter(decimal_number,3,10,2)<<endl;
 cout << intConverter(decimal_number,3,10,16)<<endl;

 cout << intConverter(hexadecimal_number,2,16,2)<<endl;
 cout << intConverter(hexadecimal_number,2,16,10)<<endl;


 return 0;
}
//숫자를 문자열화 한 값, 그 문자열의 크기, 현재 진수, 바꿀 대상 진수
char* intConverter(char* number,int size, int K, int TARGET_K){
 
 if((K!=2&&K!=10&&K!=16)||(TARGET_K!=2&&TARGET_K!=10&&TARGET_K!=16))
  return NULL;
 
 if(K==TARGET_K)
  return number;
  
 char *number_char=(char*)malloc(sizeof(char)*size);

 for(int i=0;i<size;i++)
  number_char[i]=number[i];  
 
 int decNumber=0; 

 if(K==2){
  for(int i=0;i<size;i++){
   if(number_char[i]!='0'&&number_char[i]!='1')
    return NULL;

   decNumber+=(int)(number_char[i]-'0')*pow((double)K,size-i-1);    
  }
 }else if(K==16){
  for(int i=0;i<size;i++){
   int temp;
   if((int)number_char[i]>47&&(int)number_char[i]<58)
    temp=(int)number_char[i]-48;
   else if((int)number_char[i]>64&&(int)number_char[i]<71)
    temp=(int)number_char[i]-55;
   else    
    return NULL;
   
   decNumber+=temp*pow((double)K,size-i-1);   
  }
 }else
  decNumber = atoi(number_char);
 
 if(TARGET_K==2)
  return decTobi(decNumber);
 else if(TARGET_K==10){
  char* temp=(char*)malloc(size*sizeof(char));
  itoa(decNumber,temp,10);
  return temp;
 }
 else
  return decTohd(decNumber);
}

// decimal -> binary
char* decTobi(int number){
 int count =1; 
 int usenumber=number;
 while(number>1){
  number/=2;
  count++;
 }
 
 char* msg=(char*)malloc(count*sizeof(char));
 itoa(usenumber,msg,2);

 return msg;
}

//decimal->hexadecimal
char* decTohd(int number){
 int count =0; 
 int usenumber=number;
 while(number>0){
  number/=16;
  count++;
 }

 char* msg=(char*)malloc(count*sizeof(char));
 itoa(usenumber,msg,16); 

 return msg;
}

댓글 없음:

댓글 쓰기