[C언어] 숫자를 문자로 or 문자를 숫자로 변환 시키기

in #kr-dev5 years ago (edited)

[C언어] 숫자를 문자로 or 문자를 숫자로 변환 시키기


오늘도 pc 자료폴더에 들어 있던 정리한 문자 관련 C언어 입문기 내용을 다룰까 합니다. 예전에 C언어 공부할 때 그냥 숫자를 문자로 변환하는 함수와 문자를 숫자로 변환하는 함수를 불러다 쉽게 변환시키는 코딩을 일반적으로 많이 합니다. 하지만 직접 그 과정을 로직을 짜서 만드는 경우는 드물지요. 제 경우는 C언어 입문기 때에 해당 함수를 처음에는 불러다 실행 시켜서 결과를 본 뒤에 이 함수를 어떻게 그 결과물을 만들어 낼지 직접을 해보고 싶어서 자료를 찾거나 상상력을 동원하여 직접 코딩을 해보면서 입문기를 보냈던 것 같네요. 그래서 C언어가 재밌었는지 모르겠네요.
아무튼 오늘은 숫자 & 문자를 변환 시키는 함수를 소개하고 그 로직를 코딩해보는 내용으로 post를 작성합니다.

1. 숫자를 문자로 & 문자를 숫자로 바꾸는 기본 함수


생각나는 함수가 세개가 있는데 atoi(), itoa(), sprintf()함수가 있는데 이걸 소개 합니다.

  • atoi() : 문자형을 숫자형으로 변환
  • itoa() : 숫자형을 문자형으로 변환
  • sprintf() : 숫자형을 문자형으로 변환

기본 동작을 코딩으로 살펴 봅시다.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){

 int a=123;
 int b=0;
 char buf1[10];
 char buf2[10];
 
 sprintf(buf1,"%d",a);
 printf("문자열 변환1 : %s\n",buf1); 

 itoa(a,buf2,10);
 printf("문자열 변환2 : %s\n",buf2); 

 b=a+atoi(buf1);
 printf("숫자형 변환1 : %d\n",b); 
 
}

[결과]
a1.jpg

이렇게 제공되는 기본 함수를 사용하면 쉽게 숫자형든 문자형이든 변환을 시킬 수 있습니다. 그런데 이런식으로 공부를 하면 C언어 공부가 안됩니다. 이 변환 함수를 직접 구현을 해야 공부가 됩니다.

그러면 이 변환 함수를 구현하는 코딩을 만들어 볼 필요가 있겠죠.

2. 숫자를 문자로 & 문자를 숫자로 바꾸는 구현 함수


사용자 정의함수로 해서 직접 함수를 만들어 봅시다.

문자를 숫자로 바꾸기


int atoiSub(char *str){
    int tmp=0;
    while(*str){        
        tmp=tmp*10+(int)(*str-48);      
        str++;
    }   
}

문자열 str값을 순차적으로 읽어와서 그 값을 tmp 변수에 계속 누적 덧셈을 하면 됩니다. while(str)함수로 문자열 저장공간에 값이 없는 거짓이 될때까지 동작하게 됩니다.

tmp=tmp*10+(int)(*str-48);      

위 코딩은 숫자형으로 변환하는 핵심 코딩입니다. 자세히 보시면 *str변수는 현재 str변수가 가리키는 주소지의 값을 읽어 옵니다. 그런데 거기에다가 -48을 했습니다. 그 이유는 문자형인 숫자는 아스키 코드값으로 표현 되는데 그 값이 -48의 값의 차이를 보이기 때문입니다.

참고로 0 -> 48을 가리킵니다. 1-> 49가 됩니다. 그런데 *str의 값이 '1'이 되면 이 값을 숫자로 바꾸면 아스키코드값 49가 숫자 49가 됩니다. 1을 가져와야 하는데 49를 가져 온 꼴이 됩니다. 그래서 48를 기본적으로 빼줘야 합니다. 그래야 1이라는 숫자 값을 가져오지요.

나머지 표현은 앞자리 부터 문자형 숫자를 읽어 오니깐 다음 자리로 넘어 갈때는 앞자리에 곱하기 10을 해줘야 다음 자리 숫자가 되겠죠.

숫자를 문자로 바꾸기


void itoaSub(int num,char *str,int radix){
    int tmp=num;
    int cnt=0;    
    
    while(tmp!=0){
        tmp/=10;
        cnt++;
    }
    
    str[cnt]='\0'; 
    do{ 
        cnt--;              
        str[cnt]=(char)(num%10+48);
        num = num/10;       
    }while(num!=0);        
}

좀 코딩이 길어졌네요. 두가지 loop문을 사용했습니다. 위 표현의 방식이 있지만 다른 방식도 많으니깐 한번 도전해 보세요. 아무튼 위 방식은 우선 문자열의 길이를 구하고 그 길이를 기준으로 해당 문자열변수 공간에 숫자를 집어 넣는 방식입니다.
그냥 do~while()문으로만 코딩하면 숫자는 최하위자리 숫자부터 읽어 오기 때문에 역순으로 숫자가 포인터변수에 들어가게 됩니다.

123 -> 321로 저장 됩니다. 정상적으로 123순으로 넣기 위해서는 문자열 길이를 구하고 해당 위치에 숫자를 집어 넣는 방식을 취해야 겠죠. 이방법이 싫다면 우선 역순으로 넣고 지난 시간에 배운 문자열 순서 교환하는 구현 함수를 이용하여 순서를 바꿀 수 있습니다. 다른 방법도 있긴 하지만 그냥 문자열 길이를 이용한 방식으로 코딩했네요.

참고로 문자를 숫자로 바꿀때는 -48을 했다면 여기에서는 +48을 해야 합니다. 그렇지 않으면 해당 숫자가 가리키는 아스키코드 문자를 저장하게 됩니다. 그 차이를 잘 기억해서 코딩하면 됩니다.

실험 결과는 종합 코딩으로 대신 합니다.

3. 종합 코딩


#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){

 int a=123;
 int b=0;
 int c=0;
 char buf1[10];
 char buf2[10];
 char buf3[10];
 
 sprintf(buf1,"%d",a);
 printf("문자열 변환1 : %s\n",buf1); 

 itoa(a,buf2,10);
 printf("문자열 변환2 : %s\n",buf2); 

 itoaSub(a,buf3,10);
 printf("문자열 변환3 : %s\n",buf3); 
 
 b=a+atoi(buf1);
 printf("숫자형 변환1 : %d\n",b); 
 
 c=a+atoiSub(buf1);
 printf("숫자형 변환2 : %d\n",b); 
 return 0;
 
}

int atoiSub(char *str){
    int tmp=0;
    while(*str){        
        tmp=tmp*10+(int)(*str-48);      
        str++;
    }   
}

void itoaSub(int num,char *str,int radix){
    int tmp=num;
    int cnt=0;
    
    
    while(tmp!=0){
        tmp/=10;
        cnt++;
    }
    
    str[cnt]='\0'; 
    do{ 
        cnt--;              
        str[cnt]=(char)(num%10+48);
        num = num/10;
        
    }while(num!=0);        
}

[결과]
a2.jpg

마무리


PC를 정리하면서 예전 자료를 보니깐 C언어 입문기 때에 공부했던 기억이 새롭게 다가오네요. 프로그램 언어를 공부할 때는 이렇게 기본으로 제공하는 함수를 쓰는 것도 중요하지만 그 함수를 구현해보는 공부가 무척 중요합니다. 처음에는 약간 힘드지만 익숙해지면 재미 있습니다.


Sponsored ( Powered by dclick )

dclick-imagead

Sort:  

Hello! This is a friendly reminder that you have 3000 Partiko Points unclaimed in your Partiko account!

Partiko is the most popular Steem mobile app out there! Download Partiko using the link below and login using SteemConnect to claim your 3000 Partiko points! You can easily convert them into Steem token!

https://partiko.app/referral/thecryptotrader

Posted using Partiko Android

짱짱맨 호출에 응답하였습니다.

방문해주셔서 감사해요

Congratulations @codingman! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

You received more than 8000 upvotes. Your next target is to reach 9000 upvotes.

Click here to view your Board
If you no longer want to receive notifications, reply to this comment with the word STOP

Vote for @Steemitboard as a witness and get one more award and increased upvotes!

Coin Marketplace

STEEM 0.15
TRX 0.12
JST 0.026
BTC 56095.11
ETH 2533.38
USDT 1.00
SBD 2.23