Wie ich verstehe es C-Strings, auch wenn in C++ anstelle der String-Klasse verwendet wird, müssen ein Nullabschlusszeichen:Warum fungiert ein C++ - Zeiger auf ein Zeichen als Zeichenfolge, obwohl kein Nullabschluss vorhanden ist?
This is a string.\0
Es ist mein Verständnis, dass das Fehlen eines Null-Zeichen bewirkt, dass das Programm nach dem String weiterlesen, was in den Speicher kommt, bis es die Binärdarstellung des Nullzeichens findet. Dies ist ein sehr eindeutig undefiniertes Verhalten.
Wenn ich eine dtoi-Funktion schreibe (ich wollte dies selbst schreiben für die Praxis als Teil eines anderen Übungsprojekts, das ich mache - ich weiß, dass es Bibliothekseinrichtungen dafür gibt), habe ich ein anderes Verhalten gefunden Erstellen der Zeichenfolge für die invalid_argument
Ausnahme).
int dtoi(const char d){
switch(d){ //using switch statement rather than d-'0' to support character sets with non-consecutive digits or digits that go from 9 to 0 rather than 0 to 9
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
default:
throw invalid_argument(((d == '\0') ? "null character" : &d) + string(" is not a valid digit character."));
}
}
Als Null-Zeichen zu Beginn der Ausnahme Zeichenfolge verursachte es beim ersten Zeichen zu beenden (dh., Wenn ein Null-Zeichen meiner Implementierung von dtoi geben wurden), habe ich beschlossen, es zu haben, um den Text anzuzeigen "null character" anstatt das Zeichen direkt einzufügen, wenn es '\0'
ist. Um dies zu implementieren, verwende ich den bedingten Operator. Ich kann (d == '\0') ? "null character" : d
nicht verwenden (beachten Sie, wie es d
nicht &d
am Ende sagt), da der bedingte Operator dann entweder einen Zeiger auf das erste Zeichen in dem Zeichenfolgenliteral oder direkt ein Zeichen zurückgeben kann. Um zu sehen, was passiert ist, habe ich mich entschieden, &d
auszuprobieren, und zu meiner Überraschung hat es gedruckt, welches Zeichen in der Funktion in exception.what() übergeben wurde. Ich würde erwarten, dass es einen Zeiger auf das übergebene Zeichen liefert, aber dann weiter in einen zufälligen Speicher liest, bis es ein Nullzeichen gefunden hat. Ich habe das mehrfach mit mehreren verschiedenen Zeichen versucht. Warum verhält es sich so? Habe ich eigentlich recht, dass es ein undefiniertes Verhalten ist, und es funktioniert einfach so, wie es hier beabsichtigt ist?
Weil undefined Verhalten. – juanchopanza
Für jeden, der eine Absage macht: Ich bin mir nicht sicher, warum Sie das tun - es scheint eine gültige Frage zu sein. Ich frage, ob eine bestimmte Aktion tatsächlich ein undefiniertes Verhalten ist oder ob ich falsch verstehe, wie C++ funktioniert. Wenn das irgendwie ungültig ist, sag es mir lieber, als dass du mir eine Bewertung gibst. – john01dav
@juanchopanza Das klingt sehr nach einer Antwort. – john01dav