c_str은 정상적으로 string의 내부 데이터 맨 마지막에 충실하게 널문자('\0')를 붙여서 리턴합니다.
문제는 c_str의 결과가 그냥 char형 포인터라는 데 있습니다. 즉 시작주소만 있고 길이를 나타내는 정보가 아무 것도 없는 거지요.
아시겠지만 C에서는 문자열을 처리하기 위해 시작주소만 들고 있고 "널문자가 나타나면 문자열의 끝"이라는 약속을 사용합니다. 따라서 이 포인터를 C 문자열을 처리하는 strlen strcpy fprintf 등등의 함수에 넣으면 당연히 첫번째 널문자를 만나는 순간 "여기가 문자열의 끝이로군"하고 그 시점에서 리턴해 버립니다.
이건 문자열을 처리하는 함수가 기대하는 바가 (널문자가 나오면 끝) 데이터의 현실과 (데이터 중간에 널문자가 있을 수 있음) 맞지 않는 것이기 때문에 함수를 바꿔서 해결될 수 있는 문제가 아닙니다.
c_str 대신 data와 length (혹은 size)를 불러서 시작포인터와 문자열 길이를 따로 받은 다음, 사용하는 곳에서 명시적으로 데이터의 길이를 지정해 주세요.
여기 한번 참고해보세요
http://stackoverflow.com/questions/441203/proper-way-to-store-binary-data-with-c-stl
벡터를 사용할 수 있다고 되어 있네요. 소켓 통신 예제가 들어있으니 요구하시는 것과 같아 보입니다.
c_str의 경우는 널 터미네이터까지만 반환을 보장하는 것이 당연해 보입니다.
--
일부만 리턴되는 건 아닙니다.
c_str은 정상적으로 string의 내부 데이터 맨 마지막에 충실하게 널문자('\0')를 붙여서 리턴합니다.
문제는 c_str의 결과가 그냥 char형 포인터라는 데 있습니다. 즉 시작주소만 있고 길이를 나타내는 정보가 아무 것도 없는 거지요.
아시겠지만 C에서는 문자열을 처리하기 위해 시작주소만 들고 있고 "널문자가 나타나면 문자열의 끝"이라는 약속을 사용합니다. 따라서 이 포인터를 C 문자열을 처리하는 strlen strcpy fprintf 등등의 함수에 넣으면 당연히 첫번째 널문자를 만나는 순간 "여기가 문자열의 끝이로군"하고 그 시점에서 리턴해 버립니다.
이건 문자열을 처리하는 함수가 기대하는 바가 (널문자가 나오면 끝) 데이터의 현실과 (데이터 중간에 널문자가 있을 수 있음) 맞지 않는 것이기 때문에 함수를 바꿔서 해결될 수 있는 문제가 아닙니다.
c_str 대신 data와 length (혹은 size)를 불러서 시작포인터와 문자열 길이를 따로 받은 다음, 사용하는 곳에서 명시적으로 데이터의 길이를 지정해 주세요.
댓글 달기