2014-01-11 9 views
11

Ich lese eine Eingabedatei von der Befehlszeile.basic_string :: _ S_construct null nicht gültig

int main(int argc, char **argv) 
{ 
    Scene myScene; 
string filename = argv[1]; 
myScene = Parser(filename); 
... 
} 

aus einer anderen Datei verwende ich die Parser-Funktion, die so deklariert wird;

Scene Parser(string filename) 
{ 
string line; 
ifstream myfile (filename.c_str()); 
... 
return scene; 
} 

Ich bekomme den Fehler; terminate wird aufgerufen, nachdem eine Instanz von 'std :: logic_error' geworfen wurde. what(): basic_string :: _ S_construct null nicht gültig

Programm empfangenes Signal SIGABRT, Aborted

Ich habe den Fehler gesucht. Ich denke es liegt an diesen Zeilen. Aber ich kann den tatsächlichen Grund nicht finden. Kann mir jemand helfen?

+3

Sie müssen ** niemals ** sagen 'argv [1]', wenn Sie nicht 'argc> 1 vorher überprüfen. –

Antwort

9

Das bedeutet, dass filename ist NULL in Parser, wahrscheinlich, weil Sie keine Argumente Ihres Programms Befehlszeile übergeben.

Überprüfen Sie immer, ob die erwartete Anzahl von Argumenten an Ihr Programm übergeben wird. Zum Beispiel könnten Sie tun:

int main(int argc, char *argv[]) { 
    if (argc != NUMBER_OF_EXPECTED_ARGUMENTS) { 
     exit(EXIT_FAILURE); 
    } 
    // ... 
    string filename(argv[1]); 
    Scene myScene = Parser(filename); 
    // ... 
} 
5

Es ist möglich, dass Sie Befehlszeilenargumente und als Ergebnis argv [1] ist gleich NULL vergessen haben, angeben. Sie sollten überprüfen, ob der Benutzer Befehlszeilenargumente eingegeben hat. Zum Beispiel

int main(int argc, char **argv) 
{ 
    Scene myScene; 
    string filename; 
    if (1 < argc) filename.assign(argv[1]); 
Verwandte Themen