c/c++에서 입력될 문자열 길이를 모를때 어떡하나요?
조회수 9478회
입력은 항상 문자열로 입력된다고 할 때 입력될 문자열의 길이를 모르는 상태인데 char 배열의 크기를 정해야하는데 어떻게하죠? 크기가 먼저 입력된다면 동적변수로 구현하면 되는데 크기가 입력되지 않는다면 stl이용하는거 밖에 없나요
stl프로그래밍이 뭔지 잘 모르기에 stl을 사용(?)하신다면 주석 달아주시면 감사하겠습니다!
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++ 을 사용하신 다면 두 번째 방법을 이용하시는 것이 가장 편리합니다.
댓글 입력