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

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

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

1답변

  • 좋아요

    1

    싫어요
    채택취소하기

    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++ 을 사용하신 다면 두 번째 방법을 이용하시는 것이 가장 편리합니다.

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

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.