2016-12-20 1 views
0

Ich versuche, die folgende "incoming_message" zu verschiedenen Variablen zu analysieren und der Code funktioniert einwandfrei, bis die Funktion endet. Dann bekomme ich den folgenden Fehler: "Run-Time Check Failure # 2 - Stapel um die Variable 'Netzwerknummer' wurde beschädigt."Parsen einer Nachricht mit sscanf in C++

Dies ist der Code, wo ich die Störung erhalte:

char* incoming_message = "\r\n+COPS: (2,\"MOVISTAR\",,\"12345\"),(1,\"AMENA\",,\"12346\"),(1,\"E AIRTEL\",,\"12347\"),,(0-4),(0,2)\r\n"; 
int stat; 
char network_name[16]; 
char network_number[6]; 
char processed_message[128]; 
const char* pch_msg = "%d, %[^,],, %[^')']"; 

// I introduce spaces to remove the inverted commas 
for(int i=2; i < strlen(incoming_message); i++) 
{ 
    if (incoming_message [i] == '"') 
    { 
     processed_message[i] = ' '; 
    } 
    else 
    { 
     processed_message[i] = incoming_message [i]; 
    } 
} 

for(int i=2; (incoming_message[i]!='\r') || i < strlen(incoming_message); i++) 
{ 
    if(incoming_message[i] == '(') 
    { 
     i++; 
     int const sscanf_res = sscanf(&processed_message[i], pch_msg, &stat, &network_name, &network_number); 
     if (sscanf_res != 3) 
     { 
     break; 
     } 
    } 
} 

}

Hat jemand eine Ahnung, warum ich diese Störung erhalten? Gibt es einen anderen Weg, es einfacher zu machen?

Vielen Dank im Voraus!

+1

Der String '" \ "12345 \" "' ist * sieben * Zeichen lang (zwei doppelte Anführungszeichen plus fünf Ziffern). Wie wirst du das * plus * den Terminator (acht Zeichen) in ein sechsstelliges Array einbauen? –

+0

Beachten Sie bitte, dass Arrays natürlich in Zeiger auf ihr erstes Element zerfallen, das sich von einem Zeiger auf ein Array unterscheidet. Wenn Sie ein Array von Zeichen an eine beliebige 'scanf'-Funktion übergeben, übergeben Sie sie so, wie sie ist, und lassen Sie sie vom Compiler in einen Zeiger zerfallen. Übergeben z.B. '& network_name' ist * nicht * gleich (semantisch). Bitte geben Sie die Adresse der Operatoren für die Strings in Ihrem 'sscanf'-Aufruf ein. –

+0

Danke für den Hinweis, ich nahm nicht 7 Zeichen, sondern 6. In der ersten Schleife habe ich die Anführungszeichen entfernt und im sscanf-Format füge ich ein Leerzeichen nach dem Komma hinzu. Das Problem ist in [^ ')'], weil ich einen zusätzlichen Leerraum nehme. Die Lösung ändert sich zu [^ '']. –

Antwort

0

Wie der Name schon sagt, tritt dieser Fehler auf, wenn Sie mehr Zeichen als den zugewiesenen Speicherplatz schreiben. In diesem Fall schreiben Sie 7 Zeichen in ein Array mit Platz für 6 Zeichen.

+1

Eigentlich 8. Vergessen Sie nicht den String-Terminator. –