Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++에서 문자열을 정수 배열로 변환하는 방법

개요

C/C++ 프로그래밍을 하다 보면 "2, 6, 3, 14"처럼 쉼표로 구분된 숫자 문자열을 실제 정수 배열로 변환해야 하는 경우가 종종 있습니다. 이번 튜토리얼에서는 문자열을 정수 배열로 변환하는 방법을 단계별로 살펴보겠습니다.

변환 아이디어

핵심 접근 방식은 다음과 같습니다.

  • 새로운 정수 배열을 준비합니다.
  • 주어진 문자열을 한 글자씩 순회하면서, 쉼표(,)를 만나면 다음 배열 요소로 이동합니다.
  • 숫자 문자라면 기존 값에 10을 곱한 뒤 새 자릿수를 더해 여러 자리 숫자를 완성합니다.
  • 공백 문자는 건너뛰어 잘못된 값이 배열에 들어가지 않도록 합니다.

예제 코드

#include <bits/stdc++.h>
using namespace std;
 
// 문자열을 정수 배열로 변환하는 함수
void convert_array(string str) {
    int str_length = str.length();
    int arr[str_length] = { 0 };
    int j = 0, i, sum = 0;
 
    // 문자열을 한 글자씩 순회
    for (i = 0; str[i] != '\0'; i++) {
        if (str[i] == ',') {
            j++;   // 다음 배열 요소로 이동
        }
        else if (str[i] >= '0' && str[i] <= '9') {
            // 기존 값 × 10 + 새 자릿수
            arr[j] = arr[j] * 10 + (str[i] - '0');
        }
    }
 
    cout << "arr[] = ";
    for (i = 0; i <= j; i++) {
        cout << arr[i] << " ";
        sum += arr[i];
    }
    cout << "\nSum of array is = " << sum << endl;
}
 
int main() {
    string str = "2, 6, 3, 14";
    convert_array(str);
    return 0;
}

실행 결과

arr[] = 2 6 3 14 
Sum of array is = 25

코드 핵심 포인트

  • (str[i] - '0') : 문자 '0'의 ASCII 값(48)을 빼서 문자를 실제 정수로 변환합니다. 예를 들어 '7' - '0'은 7이 됩니다.
  • arr[j] * 10 + 새 숫자 : "14"처럼 두 자리 이상의 숫자도 처리할 수 있게 해줍니다. '1'을 만나면 1이 되고, 이후 '4'를 만나면 1×10+4=14가 됩니다.
  • 공백 무시 처리 : 입력 문자열에 공백이 포함되어 있으므로 숫자 문자만 배열에 반영하도록 범위 검사 조건을 추가했습니다. 이 조건이 없으면 공백까지 숫자로 계산되어 엉뚱한 결과가 나올 수 있습니다.

더 간결한 방법: stringstream 활용

C++에서는 <sstream> 헤더의 stringstream을 사용하면 더 안전하고 간결하게 처리할 수 있습니다.

#include <bits/stdc++.h>
using namespace std;
 
vector<int> convert_with_stream(const string& str) {
    vector<int> result;
    stringstream ss(str);
    string token;
 
    while (getline(ss, token, ',')) {
        result.push_back(stoi(token)); // 앞뒤 공백 자동 처리
    }
    return result;
}
 
int main() {
    string str = "2, 6, 3, 14";
    vector<int> arr = convert_with_stream(str);
    int sum = 0;
 
    for (int v : arr) {
        cout << v << " ";
        sum += v;
    }
    cout << "\nSum of array is = " << sum << endl;
    return 0;
}

이 방식은 stoi()가 토큰 앞의 공백을 자동으로 무시해 주기 때문에 공백 처리 로직을 직접 작성할 필요가 없다는 장점이 있습니다.

마무리

문자열을 정수 배열로 변환할 때는 문자 하나씩 순회하며 자릿수를 누적하는 방식과, stringstream으로 토큰을 분리하는 방식 모두 유용합니다. 학습 목적으로는 첫 번째 방식이 변환 원리를 이해하는 데 도움이 되고, 실무에서는 stringstream 방식이 더 간결하고 오류 가능성이 적으니 상황에 맞게 선택해 사용하시기 바랍니다.