2016-06-29 5 views
3

Im folgenden Programm,Verschwunden Zeichen in String Aber Zugänglich mit dem Index

int main() 
{ 
    int i; 
    string a;//unallocated string; 

    for(i=0;i<26;i++) 
    { 
    a[i]=i+97;// trying to write a char at index i of a 
    } 
    cout<<" a[i] : "; 

    for(i=0;i<26;i++) 
    { 
    cout<<a[i];// printing the characters 
    } 

    cout<<"\n a as string : "<<a; // the string disappeared 
} 

Ausgang:

a [i]: abcdefghijklmnopqrstuvwxyz

eine als String:

Meine Fragen sind

  • Wo sind die Zeichen, die in den Indizes von String a gespeichert sind?

  • Warum gibt es keinen Fehler, wenn ich versuche, in einer nicht zugewiesenen Zeichenfolge zu schreiben?

  • Kann jemand erklären, was passiert?

  • Ich benutze gcc mit C++ 11

+2

Sie schreiben aggressiv in nicht zugeordneten Speicher, das ist was los ist. Wo sind sie gespeichert? Irgendwo undefiniert. Warum kein Fehler? Weil C und C++ nicht nach schlechter Programmierung suchen. –

+0

Undefiniertes Verhalten. – Mahesh

+3

Versuchen Sie 'a.at (i) = i + 97;' anstelle von 'a [i] = i + 97; '. Pass auf was passiert. Ihr "Fehlerprüfer" ist der 'at()' Aufruf. – PaulMcKenzie

Antwort

10

Wenn Sie a[i] tun Sie verwenden string::operator[], die explizit sagt:

einen Verweis Kehrt zum Zeichen an der angegebenen Stelle pos . Keine Grenzen Prüfung wird

ausgeführt

a ist standardmäßig so konstruiert, dass es eine Größe von 0. Sie versuchen, Index außerhalb dieser Grenzen haben wird, so alles, was Sie lesen oder schreiben ist nicht definiert.

Es sieht so aus, als ob Sie 26 als magische Zahl für die obere Grenze für Ihre Loops verwenden. Verwenden Sie stattdessen size(a) (oder vor C++ 17 verwenden Sie a.size()). Dann, wenn Sie Ihre Loops 26 mal ausführen wollte, initialisieren nur a wie folgt aus: string a(26, '\0')

Live (Slightly Improved) Example

EDIT:

Als pointed out by AndyG C++ tut uns mit besseren Möglichkeiten zur Initialisierung unserer string s in Dieser Fall iota ist eine ausgezeichnete Wahl. Anstatt Ihrer Initialisierung für die Schleife könnten Sie verwenden:

iota(begin(a), end(a), 'a') 

Ich habe das Beispiel aktualisiert, um dies zu enthalten.

+1

Oder noch besser, OP sollte überhaupt keine Schleife schreiben. Verwenden Sie etwas von '' wie 'std :: transform' – AndyG

+0

Haben Sie eine Ahnung, wo sie im Speicher sein werden? Ich bin neugierig zu wissen, dass @ Jonathan Mee –

+1

@AndyG Ich glaube, ['Iota'] (http://en.cppreference.com/w/cpp/algorithm/iota) wäre in diesem Fall zu" transformieren "vorzuziehen. Ich habe meine Antwort aktualisiert, da ich zustimme, dass dies hilfreiche Informationen sind. –

Verwandte Themen