Heim >Backend-Entwicklung >C++ >Garantiert „string::c_str()' von C 11 immer noch einen nullterminierten String?

Garantiert „string::c_str()' von C 11 immer noch einen nullterminierten String?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-27 15:35:02439Durchsuche

 Does C  11's `string::c_str()` Still Guarantee a Null-Terminated String?

Ist die Funktion string::c_str() von C 11 nicht mehr nullterminiert?

In C stellt die Klasse basic_string verschiedene Methoden zur Verfügung auf seine Charaktere zugreifen. Eine dieser Methoden, c_str(), sorgt seit C 11 für Verwirrung. Vor C 11 war c_str() für die Rückgabe eines nullterminierten Zeichenarrays verantwortlich, das den Inhalt der Zeichenfolge darstellt.

Allerdings in C 11 hat sich die Definition von basic_string::c_str() geändert. Es ist jetzt als dasselbe definiert wie basic_string::data, das wiederum einen Zeiger auf den Anfang des internen Zeichenpuffers der Zeichenfolge zurückgibt. Dies warf eine Frage auf: Bedeutet diese Änderung, dass c_str() keinen nullterminierten String mehr garantiert?

Die Antwort: Strings erfordern intern nullterminierte Puffer

Die Antwort auf diese Frage lautet nein. Trotz der Änderungen in C 11 müssen Zeichenfolgen weiterhin intern nullterminierte Puffer verwenden. Dies geht aus der Definition der Methode „operator[]“ (21.4.5) im C-Standard hervor:

Requires: pos <= size().
Returns: *(begin()+pos) if pos < size(), otherwise a reference to an object of type T with value charT(); the referenced value shall not be modified.

c_str() wird in Bezug auf „operator[]:

Returns: A pointer p such that p + i == &operator[](i) for each i in [0,size()].
Da c_str() und data beide O(1)-Operationen sein müssen, ist die Implementierung effektiv gezwungen, nullterminierte Puffer zu verwenden. Darüber hinaus stellt die Rückgabewertanforderung für „operator[] sicher, dass c_str() einen Zeiger auf einen nullterminierten Puffer zurückgibt. Daher stellt c_str() trotz der Änderungen in C 11 weiterhin eine nullterminierte Zeichenfolge bereit.

Das obige ist der detaillierte Inhalt vonGarantiert „string::c_str()' von C 11 immer noch einen nullterminierten String?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn