2011-10-13 2 views
3

문제를 해결하기 위해 레거시 코드를 살펴보고 다음과 같은 방식으로 c_str을 검사하는 것이 효과가 없다는 것을 알았습니다. 그러나 string.empty() 비교를 변경하면 작동합니다. 그래서 내 문제가 해결되지만 c_str 비교가 작동하지 않는 이유는 확실하지 않습니다. 왜 그런가?
감사합니다.
- gcc 버전 4.1.2 20080704 (Red Hat 4.1.2-46)를 사용 중입니다. c_str() == NULL이 작동하지 않습니다.

#include <iostream> 
using namespace std; 
int main() 
{ 
    string a=""; 
    if (a.c_str() == NULL) 
    { 
    cout <<"char says empty"<<endl; 
    } 
    if (a.empty()) 
    { 
    cout << "string says empty"<<endl; 
    } 
} 

는 출력은 .c_str() 아마로 설정 첫 번째 바이트로, 일부 메모리에 NULL이 아닌 문자열을 반환,
문자열이 내가 빈 문자열로, 추측에서

+0

정말요? 나는 비어있는 NULL이 아니라고, NULL을 의미합니다! = "". – daniel

+2

표준이 실제로 * null 포인터를 반환하려면 *'std :: string :: c_str()'이 필요하다고 생각합니다. –

+2

빈 문자열과 전혀 문자열이 전혀 다른 두 가지입니다. –

답변

4

a은이 경우 null이 아닙니다. 문자열 개체는 null이 아닌 내부 포인터를 가지며 해당 포인터는 c_str이 반환하는 포인터입니다.

이 확인

printf("%zu\n", a.c_str()); 

을 시도하고 당신은 실제 주소를 얻을 것이다합니다.

1

빈 나는 말한다 - 이것도 '\ 0'. IOW, 널 포인터가 아니라 길이가 0 인 문자열을 얻고 있습니다.

4

널 종결 문자열은 결코 NULL이 아니며 항상 널 종결자를 가진 유효한 메모리를 가리 킵니다. 빈 문자열은 단 하나의 \0입니다. c_str()은 null로 끝나는 문자열을 반환하도록 계약되어 있으므로 결코 NULL을 반환 할 수 없습니다. 빈 문자열을 테스트하는 올바른 방법은 실제로 empty()입니다.

1

""은 공백 문자열이 아닙니다. 메모리에는 단일 문자 인 \0이 포함됩니다. 반면에 null 문자열에는 문자가 없습니다. 아무 것도 가리 키지 않습니다. 두 가지 완전히 다른 유형의 "비어있는", 오직 하나만 테스트합니다.

1

std :: string은 빈 문자열을 저장할 때 NULL을 사용할 필요가 없습니다.

한편, NULL 종료 문자 시퀀스에 대한 포인터를 으로 반환하려면 c_str()이 필요합니다. 이 시퀀스의 최소 메모리 크기는 1입니다 ('\ 0'에는 필수). 그래서 그것은 NULL이 될 수 없습니다.

std :: string이 비어 있는지 확인하는 올바른 방법은 empty() 메서드를 호출하는 것입니다.

당신은 또한 다음과 같은 코드가 나타날 수 있습니다

char a[] = ""; 

변수 이 NULL이 아니다.

관련 문제