C++의 문자열에서 Int 구문 분석

Jinku Hu 2023년10월12일
  1. std::stoi 함수를 사용하여 문자열에서 Int 구문 분석
  2. std::from_chars 함수를 사용하여 문자열에서 Int 구문 분석
C++의 문자열에서 Int 구문 분석

이 기사에서는 C++의 문자열에서int를 구문 분석하는 방법에 대한 몇 가지 방법을 설명합니다.

std::stoi 함수를 사용하여 문자열에서 Int 구문 분석

stoi함수는 string헤더에 정의 된 문자열 라이브러리의 일부이며 문자열 값을 다른 숫자 유형으로 변환하는 데 사용할 수 있습니다. std::stoi,std::stolstd::stoll은 부호있는 정수 변환에 사용됩니다. stoi함수는 단일 ‘문자열’객체를 필수 인수로 사용하지만 프로그래머는 입력 문자열을 처리해야하는 정수와 숫자 기반을 저장할 주소를 지정할 수도 있습니다.

다음 예는stoi 함수의 여러 사용 사례를 보여줍니다. stoi는 문자열의 선행 공백을 처리할 수 있지만 다른 문자는std::invalid_argument 예외를 발생시킵니다.

#include <charconv>
#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::stoi;
using std::string;

int main() {
  string s1 = "333";
  string s2 = "-333";
  string s3 = "333xio";
  string s4 = "01011101";
  string s5 = "    333";
  string s6 = "0x33";

  int num1, num2, num3, num4, num5, num6;

  num1 = stoi(s1);
  num2 = stoi(s2);
  num3 = stoi(s3);
  num4 = stoi(s4, nullptr, 2);
  num5 = stoi(s5);
  num6 = stoi(s6, nullptr, 16);

  cout << "num1: " << num1 << " | num2: " << num2 << endl;
  cout << "num3: " << num3 << " | num4: " << num4 << endl;
  cout << "num5: " << num5 << " | num6: " << num6 << endl;

  return EXIT_SUCCESS;
}

출력:

num1: 333 | num2: -333
num3: 333 | num4: 93
num5: 333 | num6: 51

std::from_chars 함수를 사용하여 문자열에서 Int 구문 분석

대안으로 유틸리티 라이브러리의 from_chars함수는 int값을 구문 분석 할 수 있습니다. C++ 17 버전부터 표준 라이브러리의 일부였으며<charconv>헤더 파일에 정의되어 있습니다.

stoi와는 많이 다른 from_chars는 개체 길이와 테두리를 인식하지 않고 문자 범위에서 작동합니다. 따라서 프로그래머는 처음 두 인수로 범위의 시작과 끝을 지정해야합니다. 세 번째 인수는 변환 된 값이 할당 될int 변수입니다.

하지만from_chars는 입력 문자열에서 선행- 기호 만 처리할 수 있습니다. 따라서 다음 예제에서num5num6의 가비지 값을 인쇄합니다.

#include <charconv>
#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::from_chars;
using std::stoi;
using std::string;

int main() {
  string s1 = "333";
  string s2 = "-333";
  string s3 = "333xio";
  string s4 = "01011101";
  string s5 = "    333";
  string s6 = "0x33";

  int num1, num2, num3, num4, num5, num6;

  from_chars(s1.c_str(), s1.c_str() + s1.length(), num1);
  from_chars(s2.c_str(), s2.c_str() + s2.length(), num2);
  from_chars(s3.c_str(), s3.c_str() + s3.length(), num3);
  from_chars(s4.c_str(), s4.c_str() + s4.length(), num4, 2);
  from_chars(s5.c_str(), s5.c_str() + s5.length(), num5);
  from_chars(s6.c_str(), s6.c_str() + s6.length(), num6);

  cout << "num1: " << num1 << " | num2: " << num2 << endl;
  cout << "num3: " << num3 << " | num4: " << num4 << endl;
  cout << "num5: " << num5 << " | num6: " << num6 << endl;

  return EXIT_SUCCESS;
}

출력:

num1: 333 | num2: -333
num3: 333 | num4: 93
num5: -1858679306 | num6: 0
작가: 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