desister   1년 전

visual studio 에서 돌릴때는 문제가 없었는데

하기와 같이 지도를 temp[50] 으로 입력 받을려고 하면 오류가 발생합니다..

(string 으로 받아들일시는 이상 없음)

char / string 일 시 차이가 뭔지 궁금합니다..

tori1753   1년 전

char temp[50] = {0}; 말고

char temp[51] = {0}; 로 한번 시도해보시겠어요?

desister   1년 전

아 배열 크기가 부족했었군요 ㅎㅎ 제대로 돌아가네요 

dongwanpianist   6달 전

문자열, 즉 '문자 배열'의 표현방법을 살펴보시면

포인터(시작 지점)만 가지고는 배열의 끝을 알 수 없고, 실제로도 내용의 길이가 얼마나 될지 모르기 때문에

문자 배열이 끝났다는 것을 표시하는 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::stringconst char* c_str()이라는 읽기전용 포인터변수 멤버가 있으며, 이것은 기존 C의 char*의 사용과 완전히 동일한 내부 데이터입니다.

댓글을 작성하려면 로그인해야 합니다.