2016-05-08 20 views
0

Ich arbeite an einem Algorithmus in C++, und ich versuche, die Ausführung zu beschleunigen, indem Sie die cin zu scanf. Aber als ich das tat, fing ich an, SIGSEGV-Fehler zu haben.Programm empfangen Signal SIGSEGV während der Verwendung von scanf

int main(){ 

    int nominal; 
    int check; 
    string b; 
    int x; 
    int a; 

    int i = 0; 

    //cin >> a; 
    scanf ("%d",&a); 
    for (int i = 0; i<a; i++){ 
     //cin >> b; 
     scanf("%s",&b); 
     std::priority_queue <int> Q; 
     std::priority_queue < int, std::vector <int>, std::greater <int> > moneyBox; 
     while (b!="0"){ 

Der Code funktioniert nicht mehr während der Eingabe der ersten Weile. Irgendwelche Tipps, wie man es beheben kann?

+1

Sie können nicht mit 'scanf ("% s", &b);' Verwenden 'getline()' oder 'cin >> b verwenden' std :: string';. 'Statt –

+0

@ πάνταῥεῖ nicht ganz richtig Er verwenden können '' resize (big_enough) '' und dann '' data() '' member und stellen Sie dann die Größe auf den richtigen Wert später. – BitTickler

+1

Abgesehen von dieser Technik - Sie beschleunigen nichts mit dieser Änderung, hier. Es sei denn, Sie sind ein Lichtgeschwindigkeit Typer, die Zeit, die es dauert, um den Eingang zu schreiben, macht den Zeitunterschied - wenn es für Ihre Änderung zu vernachlässigen ist – BitTickler

Antwort

0

scanf() verwendet Formatierungszeichen, die vorgegebenen Typen entsprechen. "%s" ist dazu gedacht, eine nullterminierte C-Zeichenfolge in einem char-Array zu speichern. scanf() wird daher die Adresse der C++ - Zeichenfolge &b fälschlicherweise als gültige char* interpretieren, die auf ein zuvor zugeordnetes Array von Char mit ausreichender Größe verweist. Dies beschädigt den Speicher und kann UB verursachen. ..

+0

Sie können nicht UB "verursachen" , das Programm _has_ Verhalten, das nicht definiert ist. –

+0

@LightnessRacesinOrbit ok, ich habe – Christophe

+0

reformuliert Noch sagt "könnte UB verursachen". Oh well. –