2016-10-17 3 views
1
#include <iostream> 
#include <cstring> 
using namespace std; 
int main() 
{ 
    char str1[10] = "Hello"; 
    char str2[10] = "World"; 
    int len ; 
    strcat(str1, str2); 
    len = strlen(str1); 
    cout << len << endl<<str1<<endl; 
    return 0; 
} 

Wenn ich initialisieren str1 wie diese char str1[5]="hello";, C++ Compiler mir ein Fehler gibt (bedeutet, dass die Größe der Zeichenfolge sein muss 1 mehr als die gegebene Zeichenkette). Aber in der strcat sind wir verkettet str1 mit str2 mit der Größe der ersten Zeichenfolge ist 10 und die Länge der Zeichenfolge ist auch 10 (bedeutet kein extra Nullzeichen). Warum ändert sich dieses Verhalten? Konvertieren wir C++ - String mit C-String in strcat Funktion, bitte erläutern.C++ String Verhalten unterscheidet sich bei der Definition und in strcat funtion

+1

Wenn Sie Compiler-Fehler erhalten ist es immer ehlpful, wenn Sie sie auf Ihre Frage hinzufügen – Hayt

+2

Sie sind nicht C++ Strings in irgendeiner Weise mit so Sie haben damit nichts zu tun. Ansonsten weiß ich nicht wirklich, was du verlangst. Sie rufen jedoch undefiniertes Verhalten auf. –

+1

Sie müssen die [Referenz] (http://en.cppreference.com/w/cpp/string/byte/strcat) konsultieren. Da das Ziel nicht groß genug ist, haben Sie ein undefiniertes Verhalten. – NathanOliver

Antwort

2

konvertieren wir C++ String

Nein, es gibt keine C++ Strings (das heißt std::string) in Ihrem Programm beteiligt.

Warum ist dieses geänderte Verhalten?

Sie haben ein anderes Programm geschrieben, und das Verhalten ist anders.

Im ersten Fall war Ihr Programm schlecht gebildet. Der Standard erfordert, dass der Compiler Sie zur Kompilierungszeit darüber informiert. Und das Erkennen Ihres Fehlers ist auch für den Compiler einfach. Der Typ der Variablen ist "Array von 5 Zeichen". 6 Zeichen passen nicht - der Typ stimmt nicht. Typen sind zur Kompilierzeit bekannt.


Im Beispielcode verwenden Sie strcat. Wenn Sie einen Blick auf this reference nehmen werden Sie feststellen, dass

Das Verhalten nicht definiert ist, wenn das Ziel-Array sowohl nicht groß genug für die Inhalte src und dest und das abschließende Nullzeichen ist.

Standard erfordert nicht, dass der Compiler Sie vor undefiniertem Verhalten warnt. In der Tat ist es für den Compiler normalerweise ziemlich schwierig, zu beweisen, dass ein Programm undefiniertes Verhalten hat - obwohl es in diesem speziellen Fall offensichtlich erscheint.

Die Argumente von strcat sind Zeiger. Sie übergeben Zeiger des richtigen Typs an strcat. Es gibt keine Typfehler. Der Fehler hat falsche Werte. Die Werte werden zur Laufzeit in die Arrays kopiert (es sei denn, der Optimizer zaubert etwas). Um Ihren Fehler herauszufinden, müsste der Compiler die Ausführung des Programms simulieren. Dies für alle Codepfade zu tun wäre extrem langsam. Der Compiler überlässt also dem Programmierer die Verantwortung, die Voraussetzungen von strcat zu erfüllen.

0

Dies sind C-artige Zeichenfolgen, keine C++ - Zeichenfolgen, d. H. Sie verwenden nicht die Klasse std :: string. C-Style-Strings werden mit '\ 0' abgeschlossen, was bedeutet, dass Sie einen zusätzlichen Speicherplatz außerhalb der Stringlänge benötigen. "Hallo" hat eine Länge von 5, aber Sie brauchen ein Array der Größe 6, um es zu speichern. In Ihrem Beispiel ist es nicht wirklich notwendig, die Größe der Arrays angeben, tun Sie einfach die folgenden und lassen Sie den Compiler die Größe berechnen:

char str1[] = "Hello"; 

Die strcat Funktion setzt voraus, dass das erste Argument auf ein Array, das hat ausreichend Platz für die verkettete Zeichenfolge.Es ist eine gefährliche Funktion, weil es nicht prüft, ob dies tatsächlich der Fall ist, wenn nicht, überschreibt es einfach, was auch immer hinter dem Ende Ihres Arrays ist. In Ihrem Fall, indem Sie zwei Strings mit jeweils 5 Zeichen verketten, erhalten Sie eine Zeichenfolge, die 10 Zeichen lang ist, und Sie müssen sicherstellen, dass das erste Argument auf ein Array mit mindestens 11 Zeichen zeigt. Wenn Sie C++ Strings wurden unter Verwendung würden Sie nicht über irgendetwas davon zu kümmern:

#include <string> 
#include <iostream> 

int main() 
{ 
    std::string str1("Hello"); 
    std::string str2("World"); 
    str1.append(str2); 
    std::cout << str1.size() << '\n' << str1 << std::endl; 
} 
Verwandte Themen