[C언어] 문자 또는 문자열을 숫자로 변환하는 다양한 방법

Hyejin Kim·2023년 5월 7일
0

C언어

목록 보기
7/7

문자열을 숫자로 변환하기

1. atoi() 함수 사용하기

atoi 함수는 문자열을 정수형으로 변환해주는 함수입니다.
따라서 입력받은 문자열을 모두 정수형으로 변환할 수 있습니다. 하지만 atoi 함수는 int형의 범위를 넘어선 값을 변환할 때 예측할 수 없는 결과를 반환하므로, 변환할 값이 int형 범위를 넘어선다면 atoi 함수를 사용해서는 안됩니다.

또한 문자열이 숫자로 시작하지 않는 경우나, 숫자 이외의 문자가 포함되어 있는 경우 등에는 예상치 못한 결과를 반환할 수 있으므로, 입력 문자열의 유효성을 검사하는 등의 추가적인 작업이 필요할 수 있습니다.

해결책

더 큰 자료형을 사용하려면? -> atol(), atoll() 함수를 사용

2. atol(), atoll() 함수 사용하기

long int atol(const char string);
long long int atoll(const char
string);

코드예시

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

int main() {
    const char *str1 = "1234567890";
    const char *str2 = "1234567890123456789";
    
    long num1 = atol(str1);
    long long num2 = atoll(str2);
    
    printf("%ld\n", num1); // 출력: 1234567890
    printf("%lld\n", num2); // 출력: 1234567890123456789
    
    return 0;
}

주의 사항
long long int형의 범위를 넘어선 값을 변환할 때 예측할 수 없는 결과를 반환하므로, 변환할 값이 long long int형의 범위를 넘어선다면 atoll 함수를 사용해서는 안됩니다.

해결책

변환 후 문자열의 포인터를 반환하는 방법 -> strtol(), strtoll() 함수를 사용

3. strtol() , strtoll() 함수

Long 및 Long Long Integer로 문자 스트링 변환하기
strtol 함수는 문자열을 long int 형태로 변환, strtoll 함수는 문자열을 long long int 형태로 변환하는 함수입니다. 함수 원형은 다음과 같습니다.

형식(strtol())

long int strtol(const char *nptr, char **endptr, int base);

형식(strtoll())

long long int strtoll (const char *str, char **endptr, int base);

  • str: 변환할 문자열
  • endptr: 변환된 문자열의 마지막 위치를 가리키는 포인터. 이 값이 NULL이 아닌 경우, 변환된 문자열의 마지막 위치를 가리키는 포인터를 저장합니다.
  • base: 변환할 숫자의 진법. 0을 입력하면 자동으로 숫자의 진법을 판별합니다.

strtoll 함수는 변환된 long long int 값을 반환합니다. 만약 변환에 실패하면, 반환값은 0입니다.

코드 예시1

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

int main() {
  char str[] = "12345678901234567890";
  char *endptr;
  long long num;

  num = strtoll(str, &endptr, 10);

  if (*endptr != '\0') {
    printf("잘못된 입력입니다.\n");
  } else {
    printf("숫자: %lld\n", num);
  }

  return 0;
}

코드 예시2

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

int main() {
    char str1[] = "1234567890123456789";  // long long int의 범위를 넘어서는 숫자
    char str2[] = "9876543210";
    char *endptr;
    long long int num1 = strtoll(str1, &endptr, 10);
    long long int num2 = strtoll(str2, NULL, 10);
    printf("num1 = %lld, endptr = %s\n", num1, endptr);
    printf("num2 = %lld\n", num2);
    return 0;
}

위의 예시에서는 strtoll 함수를 사용하여 문자열을 long long int 형태로 변환하였습니다. str1은 long long int의 범위를 넘어서는 값을 가지고 있으므로, 변환에 실패할 것입니다. 따라서 num1에는 0이 저장되고, endptr에는 변환에 실패한 이유를 나타내는 문자열의 시작 위치를 가리키는 포인터가 저장됩니다. str2는 long long int 범위 안에 있는 값을 가지고 있으므로, 정상적으로 변환됩니다. 따라서 num2에는 9876543210이 저장됩니다.

strtoll 함수는 atoi 함수보다 큰 자료형을 다룰 수 있지만, long long int의 범위를 넘어서는 숫자를 처리할 수 없습니다.

해결책

문자열이 아닌 문자 단위로 변경하려면? -> ASCII 코드 값 이용하기

문자를 숫자로 변환하기

3. ASCII 코드 값 이용하기

문자에서 '0'을 빼서 숫자로 변환합니다.

코드 예시

#include <stdio.h>
#include <string.h>

int digit_sum(const char *str) {
    int sum = 0;
    size_t len = strlen(str);

    for (size_t i = 0; i < len; i++) {
        sum += str[i] - '0';  // 각 자리수를 숫자로 바꾸어 더해줌
    }

    return sum;
}

int main() {
    const char *str = "78720646226947352489";
    int sum = digit_sum(str);

    printf("Sum of digits: %d\n", sum);  // 출력: Sum of digits: 110
    return 0;
}

이 코드에서 for 루프를 사용하여 문자열의 각 자리수를 숫자로 바꾸어 더해줍니다. 문자 '0'의 ASCII 코드 값은 48이므로, 문자열에서 해당 문자를 뺀 값을 더해주면 해당 자리의 숫자값을 구할 수 있습니다. 마지막으로 구한 합을 반환합니다. 위의 예제를 실행하면 110이라는 결과를 출력할 것입니다.

profile
Hello. I am a developer who is still developing.

0개의 댓글