이번 시간엔 문자열을 정수로 변환하는 예제를 풀어보겠다.
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);
}
<결과>
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);
}
<결과>
count = strlen(string_num);
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;
}
이번 예제도 기존에 사용했던 메커니즘을 토대로 작동했다.
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다.
핵심 코드를 보자.
while (string_num[count] != NULL)
{
temp = temp * 10 + (string_num[count] - '0');
count++;
}
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);
}
<결과>
first_temp = GetMyInteger(first_string);
second_temp = GetMyInteger(second_string);
while (array[i] != 0) // 끝까지 돈다.
{
num = num * 10 + array[i] - '0';
i++;
}
return num;
while(array[i] != 0 && array[i] != '\n')