C언어 : 문자열 정수로 변환하기(예제)

지환·2022년 1월 11일
0

C언어

목록 보기
21/37
post-thumbnail

이번 시간엔 문자열을 정수로 변환하는 예제를 풀어보겠다.

  • 이 문제를 해결하기 위해선 간단한 아스키 코드를 변환 할 줄 알아야 된다.
int data = "467" 
  • 위와 같이 입력하면 오류가 발생한다. 왜냐하면 정수형 변수를 대입 할 수 없기 때문이다.
  • 이번 시간에 할 예제는 이런 상황에서 문자열을 -> 정수형으로 변환하는 예제를 풀어볼 예정이다.

가장 중요한 아이디어는 아스키코드다.

  • 아스키코드를 정수 값으로 변환하는 방법은 쉽다.

  • 문자로 된 숫자의 시작 값인 문자 '0'의 아스키코드 값을 각 숫자 형식의 문자에서 빼면 정수 형태의 숫자 값으로 바뀐다.

    ex: '0' - '0' <==> 48 - 48 ==> 0 // 문자'0'이 숫자 0으로 변환
    ex: '1' - '0' <==> 49 - 48 ==> 1 // 문자 '1'이 숫자 1로 변환
    ex: '2' - '0' <==> 50 - 48 ==> 2 // 문자 '2'가 숫자 2로 변환

  • 이런 원리로 변환한다.

  • 거기에 각 자릿수에 맞는 값을 곱해주면 된다.
    ex : ('1'-'0') x 100 + ('2'-'0') x 100 + ('3' -'0') s 1 = 1x100+2x10+3 = 123이다.

    이런 원리로 간단한 예제를 한 번 풀어보자.

  
#include <stdio.h>

int main()
{
	int multiply_num = 100, num = 0, temp_num; 
	char string_num[4] = "456"; //끝에 null값 떄문에
	for (int i = 0; i < 3; i++)
	{
		temp_num = string_num[i] - '0';
		num = num + temp_num * multiply_num;
		multiply_num = multiply_num / 10; // 각 자릿수를 쪼개야 되기 때문에  100 -> 10 -> 1
	}
	printf("%s  :   %d\n", string_num, num);

}

<결과>

- 여기서 짚고 넘어 갈 중요한 포인트 코드는 3가지다. 흐름을 기억하자.

temp_num = string_num[i] - '0';
num = num + temp_num * multiply_num;
multiply_num = multiply_num / 10;
  • 프레임을 조금 더 확장해보자. 위와 같이 진행한다면, 다양한 길이의 문자열을 표현 하는 것은 한계가 있다. 어떻게 하면 더 많은 표현을 할 수 있을 까?

=> 문자열의 길이를 구해서 -> 자릿수와 반복 횟수를 사용해보는 아이디어


#include <stdio.h>
#include <string.h> //strlen 함수를 사용하기 위해서 사용


int main()
{
	int multiply_num = 1, num = 0, i, count; 
	char string_num[4] = "567";
	count = strlen(string_num); // 문자열의 길이를 구하는 함수다. 문자열의 길이를 구한 후 count엔 3이 저장된다.
	for (i = 0; i < count - 1; i++)  multiply_num = multiply_num * 10; // 문자열의 길이보다 1만큼 작게 반복해야된다.
	// 이 수식은 문자열의 길이가 3일 때, 10 * 10 * 10 이 되서 300이 되는 것이 아니라, 100으로 귀결해야된다. 
	// 한 번 돌 때 마다 10씩 증가한다.
	for (i = 0; i < count; i++)
		{
			num = num + (string_num[i] - '0') * multiply_num;
			multiply_num = multiply_num / 10;

		}
		
	printf("%s가 %d로 변환됐다.", string_num, num);
}

<결과>

핵심코드를 보자.

1.

count = strlen(string_num);
  • 앞 선 예제와 가장 큰 차이점 중에 하나는 반복 횟수다. 이 부분은 상수 값이 아닌 strlen로 문자열의 길이를 구했다는 것이다. 3를 입력했던 부분과 다르게 count로 길이를 받는다.
  • 문자열의 길이를 구하고 -> 다양한 문자열을 숫자로 만들 수 있다.

2.

for (i = 0; i < count - 1; i++)  multiply_num = multiply_num * 10
for (i = 0; i < count; i++)
{
	num = num + (string_num[i] - '0') * multiply_num;
	multiply_num = multiply_num / 10;

}
  • 첫 번째 for문은 2번 돌면서 값을 곱하게 된다.
    1 -> 10 저장 // 10 --> 10 * 10 = 100 자릿 수를 맞춰주고
  • 두 번째 for문에서 돌면서 문자 값을 정수형으로 변환한다.
  • 이번 예제도 기존에 사용했던 메커니즘을 토대로 작동했다.
    ex : 5 x 100 + 6 x 10 + 7 x 1

  • 더 양질의 코드를 짤 수 있는 방법은 없을까?

  • 이번엔 배열의 각 요소 값을 계산할 떄 별도의 자리 값을 곱하는게 아니라 일정하게 10을 곱해서 문자열의 길이를 계산하지말고 코드를 짜보자.

=> 이번엔 별도의 자릿 수를 곱하는게 아니라 길이 제한 없이 문자열 형식의 숫자를 정수로 변환해보자.

#include <stdio.h>

int main()
{
	int temp = 0, count = 0;
	char string_num[4] = "567";
	//문자열이 끝날 때 까지 반복한다.
	while (string_num[count] != NULL)
	{
		temp = temp * 10 + (string_num[count] - '0');
		count++;
	}
	printf("%s의 값이 %d\n", string_num, temp);
}

간단한 아이디어가 필요하다.

ex : 5 x 100 + 6 x 10 + 7 x 1 이 원리가
ex : ((5 x 10) + 6) x 10 + 7 == 5->5 x 10 + 6 // -> 56 * 10 + 7다.

핵심 코드를 보자.

1.

while (string_num[count] != NULL)
	{
		temp = temp * 10 + (string_num[count] - '0');
		count++;
	}
  • while문은 총 3번 반복한다.
    0번 : 0 x 10 + 5 => num값에 5를 저장
    1번 : 5 x 10 + 6 => num값에 56 저장
    2번 : 56 x 10 + 7 => num값에 567 저장

gets 함수를 사용해서 두 개의 숫자를 입력 받아 합산해보자.

#include <stdio.h>

int GetMyInteger(char array[]) // first_string 및 second_string 자체가 배열이기 떄문에 배열로 받았다.
{
	int i = 0, num = 0;
	while (array[i] != 0) // 끝까지 돈다. 
	{
		num = num * 10 + array[i] - '0';
		i++;
	}
	return num;

}

int main()
{
	int first_temp, second_temp;
	char first_string[30], second_string[25];
	printf("input first number : ");
	gets(first_string); // 사용자로부터 첫 번째 first_temp 값을 입력받는다. gets을 사용한 이유는 문자열로 받기 위함이다.
	printf("input second number : ");
	gets(second_string);
	first_temp = GetMyInteger(first_string);
	second_temp = GetMyInteger(second_string);
	printf("%d * %d = %d\n", first_temp, second_temp, first_temp * second_temp);


}

<결과>

  • gets함수로 두 개의 문자열을 받는다. 두 개의 문자열을 입력 받아 곱하는 과정이다.
  • 핵심 코드를 보자.

1.

	first_temp = GetMyInteger(first_string);
	second_temp = GetMyInteger(second_string);
  • 가장 중요한 포인트 ( 문자열 -> 정수로 변환하는 아이디어다. ) 놓치면 안되는 부분.

2.

while (array[i] != 0) // 끝까지 돈다. 
	{
		num = num * 10 + array[i] - '0';
		i++;
	}
	return num;
  • 이전에 했던 함수와 동일한 원리로 돌아간다. 반복할 때마다 이전 값에 10을 곱해서 자릿수를 늘려간다.

3.

  • 만약에 우리가 gets 함수를 사용하지 않고 fgets 함수를 사용했다면 ?
  • fgets 함수는 문자열 끝에 '\n' 값이 추가된다.
  • 앞에서 (array[i] != 0) 부분 자체가 문자 끝을 의미하는 NULL 문자 0과 같을 떄까지 반복하기 때문에 '\n'도 숫자로 처리한다.
  • fgets를 사용하고 싶다면, 이렇게 코드를 짜야한다.
while(array[i] != 0 && array[i] != '\n')
  • 다음 시간엔 atoi 함수를 사용해서 문자열을 정수로 변환해보겠다.
profile
아는만큼보인다.

0개의 댓글