char temp[50] = {0}; 말고
char temp[51] = {0}; 로 한번 시도해보시겠어요?
1194번 - 달이 차오른다, 가자.
문자열, 즉 '문자 배열'의 표현방법을 살펴보시면
포인터(시작 지점)만 가지고는 배열의 끝을 알 수 없고, 실제로도 내용의 길이가 얼마나 될지 모르기 때문에
문자 배열이 끝났다는 것을 표시하는 0
혹은 '\0'
이라는 값을 마지막에 넣어줍니다.
가령 "Hello"
라고 표현하는 문자열은 {'H', 'e', 'l', 'l', 'o', 0}
라는 문자 배열(char의 배열)과 같으며, 덜 인간적이고 더 기계적으로 아스키코드에 맞게 바꾸면 {72, 101, 108, 108, 111, 0}
이라는 수열(int8_t의 배열)과 같습니다.
이것을 온전히 담으려면 "6바이트 이상 allocate된 char*
" 혹은 char[6]
이상의 크기를 갖는 배열이 필요하고,
그렇지 않으면 cin >> char*
(정확하게는 std::istream& operator>>(std::istream&, char*)
함수) 연산의 과정에서 사람이 입력한 문자열의 '\0'
을 포함해서 긴데 char배열의 크기는 그것보다 짧은 경우, 그것을 무시하고 프로그램에 할당된 범위를 초과하며 계속 쓰기를 진행하려다가 OS 차원에서 바로 오류를 던져버립니다.
.
한편, C++의 std::string
은 기존 C의 char*
로 대표되는 문자열을 더욱 원활하게 다루기 위해서 제공되는 클래스 형태의 관리자이고,
각종 연산에서 배열 끝의 0을 자동으로 처리해주는 스마트 컨테이너입니다.
일단 std::vector
와 마찬가지로 실제 내용보다 조금 더 많은 배열크기를 준비해서 어쩌다 실수로 범위를 초과한 액세스를 해도 미리 확보한 capacity 안에서는 오류가 나지 않으며 (쓰레기값으로 undefined behavior가 있긴 합니다),
std::string mystr = "Hello";
이후에 mystr += '!';
연산을 하면
mystr의 내용이 {'H', 'e', 'l', 'l', 'o', 0, ...쓰레기값들...}
의 여섯칸에서 {'H', 'e', 'l', 'l', 'o', '!', 0, ...쓰레기값들...}
의 일곱칸으로 0의 위치도 슥슥 바꿔서 처리해줍니다.
std::string
은 const char* c_str()
이라는 읽기전용 포인터변수 멤버가 있으며, 이것은 기존 C의 char*
의 사용과 완전히 동일한 내부 데이터입니다.
댓글을 작성하려면 로그인해야 합니다.
desister 1년 전
visual studio 에서 돌릴때는 문제가 없었는데
하기와 같이 지도를 temp[50] 으로 입력 받을려고 하면 오류가 발생합니다..
(string 으로 받아들일시는 이상 없음)
char / string 일 시 차이가 뭔지 궁금합니다..