c/c++에서 입력될 문자열 길이를 모를때 어떡하나요?


입력은 항상 문자열로 입력된다고 할 때 입력될 문자열의 길이를 모르는 상태인데 char 배열의 크기를 정해야하는데 어떻게하죠? 크기가 먼저 입력된다면 동적변수로 구현하면 되는데 크기가 입력되지 않는다면 stl이용하는거 밖에 없나요

stl프로그래밍이 뭔지 잘 모르기에 stl을 사용(?)하신다면 주석 달아주시면 감사하겠습니다!

  • 2017년 12월 04일에 작성됨

조회수 71


1 답변


좋아요
0
싫어요
채택취소하기

C/C++ 에서는 문자열을 표현하는 방법이 여러가지가 있습니다.

그 중 NULL 로 끝나는 문자열 같은 경우, 말씀하신 것처럼 동적 메모리로 문자열이 저장될 공간을 동적으로 직접 확장해 나가야합니다.

반면 STL (Standard Template Library) 의 std::string 은 문자열을 관리하기 위한 편리한 멤버 함수를 갖고 있으며, 문자열 길이가 변경될 때 자동으로 메모리를 확장하기 때문에 크게 신경 쓸필요가 없습니다.

이 외에 CString, QString 등 문자열을 관리하기 위한 다양한 클래스들이 존재 합니다.

이 중 C++의 표준 사항으로 있는 NULL 로 끝나는 문자열std::string 을 기준으로 설명 드리겠습니다.

동적 메모리와 std::getchar 이용

이 방법은 말씀하신 것 처럼 동적 메모리를 할당 하여 알수 없는 길이의 문자열을 저장합니다. 물론 std::scanf 에서 와 같이 공백 전 까지의 문자열을 저장합니다.

#include <cctype>
#include <cstdio>
#include <cstdlib>
#include <cstring>

int main() {
    char* input = NULL;
    {
        char value;
        int size = 0;
        int maxSize = 1;

        input = new char[maxSize + 1];
        while ((value = std::getchar()) != EOF) {
            if (std::isspace(value))
                break;
            if (size == maxSize) {
                char* temp = new char[2 * maxSize + 1];
                input[size] = '\0';
                std::strcpy(temp, input);
                delete[] input;
                input = temp;
                maxSize = 2 * maxSize;
            }
            input[size++] = value;
        }
        input[size] = '\0';
    }
    // ...
    delete[] input;
    return 0;
}

std::getchar() 는 입력된 문자열을 stdin 으로 부터 한글자 씩 읽어 옵니다. std::isspace 로 읽어온 문자가 공백인지 확인하고 input 에 저장해 나갑니다. 입력 받을 문자열의 길이를 미리 알 수 없으므로, char* temp = new char[2 * maxSize + 1]; 와 같이 문자열이 저장될 공간이 부족하면 새로운 크기의 메모리를 할당 받아 야합니다.

std::string 과 std::cin 이용

C++ 에서 문자열을 읽어오기 위한 가장 간단한 방법 입니다.

#include <iostream>
#include <string>

int main() {
    std::string input; // 문자열 객체
    std::cin >> input; // stdin으로 부터 문자열을 읽어 input 에 저장
    // ...
    return 0;
}

>> 연산자 를 통해 std::cin 으로부터 문자열을 읽어와 input 에 저장합니다.

입력한 문자열의 길이를 알지 못해도 공백 전까지의 문자열을 알아서 넣어줍니다. 실제론 위에서 설명한 작업들이 내부에서 이루어집니다.

std::string 과 std::getchar 이용

이 방법은 처음에 설명한 동적 메모리를 이용하여 문자열을 받는 방법과 유사합니다. 다른 점이 있다면 std::string 을 이용한다는 점입니다. push_back() 으로 한 문자씩 input 에 추가해 나갑니다. 메모리를 확보하는 것은 std::string 이 알아서 해주기 때문에 신경 쓸 필요가 없습니다.

#include <cctype>
#include <cstdio>
#include <string>

int main() {
    std::string input; // 문자열 객체
    {
        char value;
        while ((value = std::getchar()) != EOF) {
            if (std::isspace(value))
                break;
            input.push_back(value); // input 의 마지막에 value 에 저장된 문자 추가
        }
    }
    // ...
    return 0;
}

결론

C 를 사용하신 다면 첫 번째와 같은 방법을 이용하시면 됩니다. C++ 을 사용하신 다면 두 번째 방법을 이용하시는 것이 가장 편리합니다.

  • 2017년 12월 04일에 작성됨

  • cin >>string가 안되는 걸로 알고있었는데 잘못알고 있었네요.. 정말 감사합니다!!    원동규   2017.12.6 23:31     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close