▸C언어/개발 TIP

atoi() 함수 없이 문자열의 숫자를 int타입으로 변환

코데방 2019. 12. 5.
728x90

아래와 같이 char 타입은 int 타입과 같이 바로 정수 계산이 됩니다.

  • 정수형으로 데이터를 저장하기 때문에, 연산자 계산 시 int 타입 계산과 동일
  • 정수형("%d")으로 출력하면 int형과 동일하게 출력됨 (다만 int타입은 4byte, char타입은 1byte)
  • 문자형("%c")으로 출력하면, 저장하고 있는 정수가 표현하는 아스키코드상의 문자를 출력해줌

이러한 특성 때문에 char타입은 int타입과 동일하게 작동하고, 다만 1byte로 사이즈만 작다고 볼 수 있습니다.

 

 

 


 

하지만 문자열(String)에서는 아래와같이 다른 결과가 나옵니다.

  • 숫자도 무조건 문자로 인식해서 아스키코드의 번호로 저장  (즉, '문자 1 == 아스키코드 49' 로 저장)
  • 출력할때도 하나하나 아스키코드→문자열로 변환해서 출력
  • 문자열에서 1 + 2 == 49 + 50 == 99가 됨

따라서 문자열에 포함된 숫자를 액면 그대로 사용할 수는 없습니다.

 

 

 


 

입력받은 값을 처리하거나 할 때는 문자열로 받아서 숫자로 변환해서 처리하는 경우가 많은데, 이 경우에는 문자형을 정수형으로 변환해줘야 합니다.

문자열에 포함된 숫자를 정수형으로 변환하는 방법 중 가장 흔하게 쓰이는 방법은 atoi() 함수를 사용하는 것입니다. atoi() 함수는 문자열의 시작부터 숫자로 되어 있는 부분만 읽어서 정수형으로 변환해주고 시작점이 숫자가 아닌 경우 0값을 반환해줍니다. 숫자로 시작할때는 숫자가 끝나는 지점까지만 변환해줍니다.

 

앞에 있는 숫자만 뽑아내려면 atoi() 함수를 사용하면 간단한데, 뒤에 있는 숫자까지 뽑아내려면 결국 뒤의 숫자가 시작하는 위치를 파악해서 한번 더 atoi() 함수를 사용해줘야 합니다.

 

뭔가 코드가 깔끔하지 않아보이네요. 제 스타일은 아닙니다. ㅎㅎ 그리고 문자열이 길고, 섞여 있는 숫자와 문자열을 따로 처리해줘야한다면 더 복잡한 코드가 되버리는 문제가 생기더라구요.

 


 

이 경우 좀 더 깔끔한 방법으로 문자열의 숫자를 처리하는 방법이 있습니다.

 

  • 문자열의 숫자 - '0' == 정수형 숫자
  • 아스키코드상 문자 1 == 49, 문자 0 == 48이기 때문에, 49-48 == 1 이 됨. 나머지 숫자도 동일

문자형 숫자에서 문자형 '0'을 빼버리면 간단하게 계산이 됩니다. 물론 코드는 예시용이라 문자가 여러 개 있다거나 할 때 등 다른 조건은 가정하지 않고 대충 짰습니다.

※ Point (개별 숫자를 하나의 숫자로 만들기)
숫자가 합쳐지면 자릿수가 10씩 증가합니다. 따라서 자릿수만 늘려주면 간단히 해결됩니다.
[1, 2, 3을 합칠 경우]
a = 0
a = (a * 10) + 1 == 1
a = (a * 10) + 2 == 12
a = (a * 10) + 3 == 123
아래 코드 중 [a = a * 10 + (문자열의 숫자 -'0')] 부분입니다.

 

 

 


 

아래와 같이 atoi() 함수도 반복문으로 돌릴 수는 있지만, 숫자와 문자를 각기 다르게 처리하거나 숫자별로 다른 여러 조건으로 처리할 때는 위와 같이 처리하는게 더 효율적일 때가 있는 것 같습니다. 알아두면 편리하게 사용할 수 있습니다.

 

 

728x90

댓글

💲 추천 글