std :: string에 null 종결자가 포함되어 있습니까?


87

아래 문자열에 null 종결 자 '\ 0'이 포함됩니까?

std::string temp = "hello whats up";

감사! :)



1
이제 @jahhaj의 수락 된 답변이 user529758의 답변과 충돌하며 답변이 더 최신 상태입니다. 자세히 살펴보면서 Jesse Good의 댓글을 건너 뛰었으므로 여기에서 그 중요성을 강조했습니다.
Jonathan Komar

답변:


99

아니오, 그러나 temp.c_str()널 종료자는이 메소드의 리턴에 포함됩니다.

다른 문자와 마찬가지로 문자열에 null 문자를 포함 할 수 있다는 점도 언급 할 가치가 있습니다.

string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';

인쇄물

5 5

하지 5 1널 문자가 문자열에 대한 특별한 의미가 있다면 당신은 예상대로.


5
전화 temp.c_str()하면 널 문자가 포함됩니다. 문자열에 정말로 필요하면 다른 문자처럼 추가하십시오. temp.push_back('\0'). 이제 두 개의 null 문자 temp.c_str()가 포함됩니다 .
jahhaj

1
@dupdupdup, 일부 응답에서 언급했듯이 null로 끝나는 문자열이 필요한 경우 생성 된 객체에서 s.c_str ()을 호출해야합니다. 끝에 '\ 0'이있는 문자 배열에 대한 포인터를 반환합니다.
Maksim Skurydzin

@Rico, Jahhaj 문자열을 종료하는 방법. 예를 들어-문자열에 str [i]로 몇 개의 문자를 추가했습니다. 이제 cout을 사용하여 인쇄 할 수 없습니다.
Bhavuk Mathur

요점에 추가하려면 : 연산자 <<가 오버로드되었으므로 cout << s는 char로 전체 문자열 char을 인쇄하지만 c_str ()을 사용하고 << 연산자에 넣으면 null char. 다음 프로그램은이 점을 떨어 뜨립니다. {string s ( "SampleString"); cout << s.size () << "\ t"<< s << endl; s [3] = '\ 0'; cout << "\ n \ n Null 이후 \ n \ n"<< s.size () << "\ t"<< s << endl; cout << "\ n \ n c_str 가져 오기 \ n \ n"<< s.size () << "\ t"<< s.c_str () << endl; }
Fooo

70

C ++ 03에는 없으며 C ++ 11 이전에는 C ++ std :: string이 메모리에서 연속적이라는 보장조차 없습니다. C 문자열 (문자열 저장을위한 char 배열)에만 null 종결자가 있습니다.

C ++ 11 이상 mystring.c_str()에 상당 mystring.data()에 상당 &mystring[0]하고, mystring[mystring.size()]이 보장된다 '\0'.


4
C ++ 11에서는 이제 문자열이 메모리에서 연속적임을 보장합니다.
zneak

@zneak 감사합니다! 업데이트되었습니다. 그러나 적어도 합리적으로 C ++ 11 호환 컴파일러가 있는지는 의심 스럽습니다. 심지어 GCC도 지원을 중단했습니다.

4
@ H2CO3 : C ++ 11은 제쳐두고 2005 년 DR 530 에서 해결되었습니다 . 대부분의 표준 라이브러리 구현은 적어도 오랫동안 연속 메모리에 문자열 데이터를 저장했습니다.
ildjarn

3
@ildjarn 감사합니다. 정확히 찾고있었습니다. 이동에 대한 근거의 일부는위원회의 아무도 연속 메모리를 사용하지 않는 STL 구현을 알지 못했다는 것입니다.
zneak

7
@ H2CO3 : 솔직히 그게 기분이 상했다면 더 두꺼운 피부가 필요합니다.
ildjarn

8

이것은 여기에서 '포함'에 대한 정의에 따라 다릅니다. 에

std::string temp = "hello whats up";

몇 가지 유의할 사항이 있습니다.

  • temp.size()처음 h부터 마지막까지 p(둘 다 포함) 문자 수를 반환합니다.
  • 그러나 동시에 temp.c_str()또는 종료 자 temp.data()와 함께 반환 null됩니다.
  • 즉, 0int(temp[temp.size()])됩니다.

나는 여기에 몇 가지 답변과 비슷한 소리, 알고 있지만 나는 것을 지적 할 sizestd::string의 것이 C++되어 별도로 관리하고이 같은하지 않습니다C당신은 당신이 처음 발견하지 않는 한 계산 유지 곳 null터미네이터.

추가하려면 string literal포함 된 \0. 이 경우 다음과 같이 구성이 std::string첫 번째 null문자 에서 중지됩니다 .

std::string s1 = "ab\0\0cd";   // s1 contains "ab",       using string literal
std::string s2{"ab\0\0cd", 6}; // s2 contains "ab\0\0cd", using different ctr
std::string s3 = "ab\0\0cd"s;  // s3 contains "ab\0\0cd", using ""s operator

참조 :


2

예를 호출하면 temp.c_str()null로 끝나는 c-string이 반환됩니다.

그러나 개체에 저장된 실제 데이터는 tempnull가 종료되지 않을 수 있지만, 그것은 중요하지 않습니다 그리고해야 문제가되지 프로그래머, 다음 프로그래머 욕구 때 때문에 const char*, 그가 부를 것이다 c_str()반환 null로 보장 대상에 -종결 된 문자열.


1
null 종결 자 (존재하는 경우)도에서 반환 할 때 포함되지 않습니다 temp.size().
jahhaj

1

C ++ 문자열을 사용하면 그것에 대해 걱정할 필요가 없으며 구현에 따라 달라질 수 있습니다.

사용 temp.c_str()하면 문자열의 C 표현을 얻습니다 \0. 그 외에는 C ++ 문자열에서 어떻게 유용할지 모르겠습니다.


1

std::string내부적으로 문자 수를 유지합니다. 내부적으로는이 개수를 사용하여 작동합니다. 다른 사람들이 말했듯이, 디스플레이를 위해 문자열이 필요하거나 어떤 이유로 든 c_str()끝에 null 종결자가있는 문자열을 제공 하는 메서드를 사용할 수 있습니다.


이 문장에 대한 몇 가지 참조를 제공 할 수 있습니까? "std :: string은 내부적으로 문자 수를 유지합니다. 내부적
으로는
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.