Heim > Backend-Entwicklung > C++ > Warum führt die Verkettung eines Zeichens mit einer Zeichenfolge in C manchmal zu einer unerwarteten Ausgabe?

Warum führt die Verkettung eines Zeichens mit einer Zeichenfolge in C manchmal zu einer unerwarteten Ausgabe?

Barbara Streisand
Freigeben: 2024-10-25 07:35:28
Original
270 Leute haben es durchsucht

Why Does Concatenating a Character to a String in C   Sometimes Lead to Unexpected Output?

Verketten von Zeichenfolgen- und Zeichenliteralen in C

In C kann der Operator für die Verkettung von Zeichenfolgen und Zeichen verwendet werden. Dieses Verhalten variiert jedoch je nach Art der beteiligten Operanden.

Beachten Sie den folgenden Code:

<code class="cpp">string str = "ab" + 'c';
cout << str << endl;</code>
Nach dem Login kopieren

Dieser Code erzeugt wie erwartet die Ausgabe „abc“. Dies liegt daran, dass das String-Literal „ab“ automatisch in einen const char*-Zeiger konvertiert wird. Das Zeichenliteral „c“ wird zu einem ganzzahligen Wert heraufgestuft und zur Adresse des Zeichenfolgenliterals hinzugefügt. Das Ergebnis ist eine neue Zeichenfolge, die die Zeichen „abc“ enthält.

Bedenken Sie jedoch diese Alternative:

<code class="cpp">char ch = 'c';
string str1 = "ab";
string str2 = str1 + ch;
cout << str2 << endl;</code>
Nach dem Login kopieren

Dieser Code erzeugt die unerwartete Ausgabe „ed“.

Um dieses Verhalten zu verstehen, müssen wir zunächst beobachten, dass die Zeichenfolge str1 vom Typ string und nicht vom Typ const char* ist. Wenn wir das Zeichen ch zur Zeichenfolge hinzufügen, versucht der Compiler, den überladenen Operator für Zeichenfolgenobjekte zu verwenden. Es gibt jedoch keine Operatorüberladung für string und char.

Um diese Mehrdeutigkeit aufzulösen, stuft der Compiler ch in eine Ganzzahl hoch und führt die Addition wie im ersten Beispiel durch. Da die resultierende Adresse jedoch über den zugewiesenen Speicher für die Zeichenfolge str1 hinausgeht, kommt es zu undefiniertem Verhalten. Von dieser Adresse werden Zeichen abgerufen, bis ein Nullzeichen gefunden wird, was zu einer unerwarteten Ausgabe führt.

Um dieses Verhalten zu verhindern, können wir „ab“ explizit in eine Zeichenfolge umwandeln, bevor wir „c“ hinzufügen:

<code class="cpp">string str = std::string("ab") + 'c';</code>
Nach dem Login kopieren

Alternativ können wir den Verkettungsoperator = verwenden:

<code class="cpp">string str = "ab";
str += 'c';</code>
Nach dem Login kopieren

Beide Ansätze stellen sicher, dass das Ergebnis eine gültige Zeichenfolge ist.

Das obige ist der detaillierte Inhalt vonWarum führt die Verkettung eines Zeichens mit einer Zeichenfolge in C manchmal zu einer unerwarteten Ausgabe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage