2013-09-03 2 views
2

나는 char * 문자열을 포함하는 String 개체를 만들었습니다. 회원. 매개 변수 멤버보다 내 개체에서 구성원을 char * 변수로 복사하여 연산자 +를 오버로드하고 있습니다. 하지만 결과를 인쇄 할 때 어떤 이유로 약 16 개의 giberish 문자가 추가됩니다 (캐스팅 과부하는 100 % 유효). 나는 그것을 char * sum = 새로운 char [길이]로 좁혔다. 이것이 문제 다. 나는 strlen (sum)을 검사했고, 길이가 6 글자 인 것으로 가정 할 때 22와 같았다. 문제가 무엇인지 실마리가있는 사람이 있습니까?내 C 스타일 문자열이 매우 이상하게 작동합니다.

String String::operator+(const String& rhs) 
{ 
    int length = strlen(string) + strlen(rhs.string); 
    char* sum = new char[length]; 
    for(int i=0;i<strlen(string);i++) 
     sum[i] = string[i]; 
    for(int i=0;i<strlen(rhs.string);i++) 
     sum[strlen(string) +i] = rhs.string[i]; 
    String s(sum); 



    return s; 

} 

편집 : 예를 들어, 그래서 내 결과에 추가 = 지금 횡설수설가 없어,하지만 난 여전히이 "1"+ "2"+ "3"지금 "1 = 2 = 3". 이것은 NULL 종결자가 잘못된 것으로 해석 된 결과입니까?

다시 편집 해주세요. 정말 마음이 편치 않았고, [길이 +1] = [길이] 대신 '\ 0'으로 설정되었습니다. 좋은 답변을 주셔서 다시 한 번 감사드립니다!

+9

'string'을 변수 이름으로 사용하는 것은 좋지 않습니다. – Michael

+0

교육적인 목적으로이 작업을 수행한다고 가정합니다. 아니면'std :: string'을 사용하지 않는 다른 이유가 있습니까? –

+0

교육 목적이 옳다, 나의 친구 –

답변

11

strlen은 문자열 시작부터 종료 문자 '\ 0'까지의 문자 수를 알려줍니다. '

char *sum = new char[length + 1]; 

을하고'\ 0을 추가 '당신이 두 개의 문자열을 복사 한 후 새 문자열을 할당하면 종료'\ 0 공간을 확보해야합니다.

7

종료 용 '\0' 문자에는 메모리를 할당하지 않습니다. 연결에 length+1 바이트를 할당해야합니다. 또한 sum[length] = '\0'을 설정해야합니다.

7

length자를 할당하고 있습니다. 이는 종료 null을 저장할 공간이 충분하지 않습니다. 또한, 당신은 null을 쓰고 있지 않습니다. C 스타일 문자열은 null로 끝납니다.

로컬 변수에 strlen의 결과를 저장하십시오. 컴파일러가 안전하게 strlen (보장되지 않음)을 최적화 할 수 없다는 것을 컴파일러가 알지 못하면 반복 호출은 함수를 으로 매우 어둡게으로 만듭니다.

+0

호기심 때문에, 왜'strlen'의 결과를 로컬에 저장하면 이것이 매우 느린 것일까 요? 여기서 별칭이 지정된 포인터 만 생각할 수 있지만 극적인 문제는 아닌 것 같습니다. –

+0

미안하지만, 그건 내 말에 극히 형편없는 표현이었다. ** 결과를 저장하지 않으면 속도가 느려집니다. 명확히하기 위해 편집 됨. –