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>
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>
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>
Alternativ können wir den Verkettungsoperator = verwenden:
<code class="cpp">string str = "ab"; str += 'c';</code>
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!