2016-06-17 3 views
4

나는 C++의 살펴에서 예 nullptr의 사용에 의해 혼란 스러워요 :C 스타일 문자열을 종료하는 데 nullptr이 사용됩니까?

int count_x(char* p, char x) 
// count the number of occurrences of x in p[] 
// p is assumed to point to a zero-terminated array of char (or to nothing) 
{ 
    if (p==nullptr) return 0; 
    int count = 0; 
    for (; p!=nullptr; ++p) 
     if (*p==x) ++count; 
    return count; 
} 
// The definition of count_x() assumes that the char* is a C-style string, 
// that is, that the pointer points to a zero-terminated array of char. 

나는 p가 지정되지 않은 경우 count_x 종료해야 함을 이해하고, 그 끝에 도달 할 때 루프의 종료한다 p가 참조하는 C 스타일 문자열의 내가 count_x()를 사용하는 주요 기능을 빌드 할 때

그러나, 결코 제대로 종료 것 같다 :

int main() { 

    char teststring[] = {'b', 'l', 'a', 'h', '\0'}; 
    cout << "teststring is: " << teststring << endl; 
    cout << "Number of b's is: " << count_x(teststring, 'b') << endl; 

    return 0; 
} 

는 실행이 쓰레기를 많이 인쇄 한 다음 세그멘테이션 오류로 종료됩니다. count_xfor (; p!=nullptr; ++p)for (; *p!='\0'; ++p)으로 바꾸면 제대로 실행됩니다. 나는 이것이 문자열이 올바르게 종료되지 않았다는 것을 의미한다. 그렇다면 nullptr을 여기에서 사용할 수 있도록 C 스타일의 문자열을 어떻게 종료합니까?

편집 :이 상황을 설명하는 의견에 토론이있었습니다. 위의 내용이 잘못 인쇄 된 2013 년 9 월부터 책의 첫 번째 글자를 사용하고 있습니다. 2015 년 1 월 (코멘트에 링크 된) 책의 세 번째 인쇄물에는 for (; p!=nullptr; ++p) 대신 for (; *p!=0; ++p)을 사용하는 수정 된 예제가 있습니다. 이 정정 사항은 책의 정오표에도 기록되어 있습니다. 감사!

Edit2가 : 죄송합니다 사람이 분명히 이미 이전에 여기에 질문을 받았다 : Buggy code in "A Tour of C++" or non-compliant compiler?

+3

게시 한'count_x' 함수가 작동하지 않습니다. 'nullptr'은 그런 식으로 작동하지 않습니다. – user2357112

+11

코드가 깨졌습니다. 무시해. 아마도'for (; * p! = 0; ++ p)'를 의미했을 것입니다. –

+0

저에게 책에있는 실수처럼 보입니다. – Galik

답변

12

아니, 널 포인터는 문자열을 종료하는 데 사용되지 않습니다. NUL 문자가 사용됩니다. 그것들은 다른 것이지만, C 중 하나에 정수를 할당하면 결과는 항상 동일합니다 : 0 (영).

NUL 문자는 C에서 '\0'으로 표시되며 하나의 char을 차지합니다. NULL 포인터는 C에서 0으로 표시되며 void *과 같은 저장소를 사용합니다. 예를 들어, 64 비트 시스템에서 void *은 8 바이트이고 '\0'은 1 바이트입니다.

즉, nullptr은 '\0'과 같지 않습니다. 그리고 문자는 NUL이라고하는 널 문자이지만 NULL 바이트 또는 NULL 문자라고는하지 않습니다.

관련 문제