Lasiyan
Algorithm

엔터까지 N개의 숫자 입력 받기 - C++

#알고리즘#C++#표준 입출력#문자열

딱히 문제가 있어서가 아니라 단순히 저장 용으로…

알고리즘을 풀거나 기타 코딩을 하다보면 특정 숫자를 입력받아야 하는 경우가 생긴다.

흔히 int형 배열, 예를 들어 int num[10]과 같이 정해진 숫자를 입력받는 것은 1학년 C언어 시간에 아주 많이 해보았을 것인데

정해지지 않은 수 만큼 입력받는 것에 대해서는 생각해 본 적이 없어 복습 차 구현해보았다.

물론 더 쉬운 Toknizer나 stringstream을 사용할 수 있는 방법도 참고한다

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
    string strInput; // 띄어쓰기 기준으로 N개의 수를 입력받을 String
    vector<int> vecNum; // 입력받은 N개의 수를 저장할 Vector

    // 숫자 입력 받기
    cout << "숫자를 입력하세요 : ";
    getline(cin, strInput);

    // 문자열 출력
    cout << "문자열 : " << strInput << endl;

    string strNum = ""; // 각각의 숫자를 저장할 임시 String
    for(int i = 0; i < strInput.length(); i++)
    {
        if(strInput.at(i) == ' ')
        {
            // 현재까지 저장한 문자(숫자)들을 Vector에 추가 후 String 초기화
            vecNum.push_back( atoi(strNum.c_str()) );
            strNum = "";
        }
        else
        {
            // 띄어쓰기가 나올 때까지 문자 더함
            strNum += strInput.at(i);
            continue;
        }
    }
    vecNum.push_back( atoi(strNum.c_str()) ); // 마지막 숫자도 벡터에 추가

    cout << "숫자 : ";
    for (int i = 0; i < vecNum.size(); i++)
    {
        cout << vecNum[i] << " ";
    }
    cout << endl;

    return 0;
}

cout 출력문과 엔터가 많아 코드가 길어보이는데 실제로 중요한 부분은 19~35라인이다.

먼저 띄어쓰기 단위로 숫자를 입력받기 위해 그 전체를 문자열로 생각하였다.

예를 들어 11 22 33 44 55[엔터]를 입력하면 숫자 11, 22, 33, 44, 55가 아닌 11~55까지 전체를 문자열로 생각한 것이다. 물론 띄어쓰기는 포함해서.

그리고 나서 시작 지점부터 띄어쓰기가 나올 때까지 임시 string인 strNum에 숫자를 저장한다.

그러다 띄어쓰기가 나오면 strNum에 있는 숫자를 vecNum에 저장하고(push_back) strNum을 초기화한다. 다음 숫자를 저장하기 위해서.

참고로 string 클래스를 int로 변경하기 위해서는 atoi를 사용하는데, atoi의 인자가 char*형이다.

따라서 String클래스의 c_str()를 사용하여 char*로 변환해준 것이다.

위의 경우 11다음에 나오는 띄어쓰기, 22다음에 나오는 띄어쓰기 등이 조건에 해당될 것이다.