C에서 Char*를 Int로 변환

Jinku Hu 2023년10월12일
  1. strtol함수를 사용하여 C에서char *int로 변환
  2. C에서char *int로 변환하기위한strtol함수의 결과를 올바르게 확인
C에서 Char*를 Int로 변환

이 기사에서는 C에서char *를 int로 변환하는 방법에 대한 몇 가지 방법을 설명합니다.

strtol함수를 사용하여 C에서char *int로 변환

strtol함수는 C 표준 라이브러리의 일부이며char *데이터를 사용자가 지정한대로 정수 값으로 변환 할 수 있습니다. 이 함수는 3 개의 인수를 취하며, 첫 번째 인수는 문자열이있는 포인터입니다. 이char포인터 인수는 수정되지 않으며const규정자가 있습니다. 두 번째 인수는 발견 된 첫 번째 유효하지 않은 문자 또는 발견 된 숫자가없는 경우 전체 문자열을 저장하는 데 사용될 수 있습니다. 세 번째 인수는 변환 할 숫자의 밑수를 지정하며이 인수의 값은 2에서 36 사이 여야합니다. 다음 예제는char *배열의 요소를 정수로 변환하고 콘솔에 출력하는 방법을 보여줍니다.

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

void printIntegers(long int arr[], size_t size) {
  for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
  printf("\n");
}

int main(int argc, char *argv[]) {
  char *arr[] = {"12", "33", "43", "23", "90"};

  size_t len = sizeof arr / sizeof arr[0];
  long int arr3[len];
  for (int i = 0; i < len; ++i) {
    arr3[i] = strtol(arr[i], NULL, 10);
  }
  printIntegers(arr3, len);

  exit(EXIT_SUCCESS);
}

출력:

12 |   33 |   43 |   23 |   90 |

대안으로 프로그램 인수를 입력 문자열로 취하여 정수 유형으로 변환 할 수 있습니다. 프로그램 인수에 액세스하여 처리하려면main함수의 매개 변수로int argc, char * argv[]를 사용해야합니다. 다음 샘플 코드는 사용자가 프로그램에 최소한 단일 인수를 제공했는지 확인하고 그렇지 않은 경우 해당 오류 메시지 표시를 종료합니다.

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

void printIntegers(long int arr[], size_t size) {
  for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
  printf("\n");
}

int main(int argc, char *argv[]) {
  if (argc < 2) {
    printf("Usage: ./%s int1 int2 int3...\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  long int arr2[argc - 1];
  for (int i = 0; i < argc - 1; ++i) {
    arr2[i] = strtol(argv[i + 1], NULL, 10);
  }
  printIntegers(arr2, argc - 1);

  exit(EXIT_SUCCESS);
}

C에서char *int로 변환하기위한strtol함수의 결과를 올바르게 확인

이전 예제에서 프로그램 인수로 전달 된 문자열을 정수로 변환하기 위해strtol호출을 성공적으로 사용 했음에도 불구하고 주어진 프로그램이 실패 할 가능성이 높습니다. strtol함수 호출에 대한 오류 검사 루틴을 구현하여 해당 오류 로깅과 함께 강력한 프로그램 실행을 보장하는 것이 좋습니다. 변환 된 정수가long유형 범위 내에 있는지 그리고 변환 자체가 실패했는지 확인합니다. 또한 유효한 정수 뒤에 문자가 있는지, 주어진 입력이 10 진수인지 확인합니다. 그러나 우리는 각 경우에 오류 메시지를stderr스트림에 인쇄하고 프로그램을 종료하지 않을 것입니다.하지만 필요에 따라 다른 처리 루틴을 고려해야합니다.

#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printIntegers(long int arr[], size_t size) {
  for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
  printf("\n");
}

int main(int argc, char *argv[]) {
  if (argc < 2) {
    printf("Usage: ./%s int1 int2 int3...\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  long int num;
  char *endptr, *str = argv[1];
  errno = 0;
  long ret = strtol(str, &endptr, 10);

  if (str == endptr) {
    fprintf(stderr, "%s: not a decimal number\n", str);
  } else if ('\0' != *endptr) {
    fprintf(stderr, "%s: extra characters at end of input: %s\n", str, endptr);
  } else if ((LONG_MIN == ret || LONG_MAX == ret) && ERANGE == errno) {
    fprintf(stderr, "%s out of range of type long\n", str);
  } else if (errno != 0 && ret == 0) {
    fprintf(stderr, "%s no conversion was performed\n", str);
  } else {
    num = ret;
    printf("num: %ld\n", num);
  }

  exit(EXIT_SUCCESS);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C Integer