2017-10-26 2 views
-1

Ich habe ein Programm, das Textdateien dekomprimiert. Wenn der Eingang 4A ist, sollte "AAAA" gedruckt werden. Mein Problem ist, wenn ich versuche, die Ganzzahlen zu trennen, die in der Schnur enthalten sind, weil, nachdem das Programm 3 Zahlen liest, es in eine Endlosschleife zu kommen scheint. dies ist mein Code:Trennen Sie die ganzen Zahlen von einer Zeichenfolge

while (getline(cin, line)){ 
    for(i = 0; i<line.length(); i++) { 
     char * x = &line.at(i); 
     if(isdigit(line.at(i))){ 
      counter = atoi (x); 
     } 
     ............... 
**Do Something** 

Ich habe versucht, so bald das Zeichen x zu drucken, wie sie einen Wert bekommt, aber wie ich schon sagte, nachdem es 3 Zahlen liest es in eine Endlosschleife zu bekommen. Bitte helfen Sie

Vielen Dank im Voraus.

+0

Verwenden Sie einen Debugger. –

+0

Das ist nicht dein Code. Das ist Ihre Zusammenfassung dessen, was Sie denken, verursacht das Problem - das ist nicht das Gleiche. Versuchen Sie, tatsächlichen Code zur Verfügung zu stellen, mit dem andere Ihr Symptom in Form eines [mcve] neu erstellen können. Stellen Sie auch eine Stichprobe von Daten bereit, die das Symptom mit diesem Code auslösen. – Peter

+0

Ist Ihnen bewusst, dass 'atoi()' so lange Zeichen wie Ziffern verarbeitet (d. H. Es stoppt bei der ersten Nicht-Ziffer, die das Beenden von '\ 0' einschließt). Bitte denken Sie über die folgenden Fälle nach: "12A" (komprimiert von "AAAAAAAAAAAAA"), "35A" (komprimiert von "555A") und schließlich "35". Letzteres könnte möglicherweise 'atoi()' dazu zwingen, nach dem Pufferende zu lesen, wenn "line" vom Typ "std :: string" ist. AFAIK, Sie können nicht darauf zählen, dass der interne Puffer von 'std :: string' mit '\ 0' beendet wird. (Für diese Zuweisung existiert 'std :: string :: c_str()'.) – Scheff

Antwort

2

Sie verwenden die Variable i in der inneren zweiten Schleife (die den Wert von i zurücksetzt), also die Endlosschleife.

+0

Oh mein. Vielen Dank Kumpel. Hab das überhaupt nicht bemerkt! –

0

Hier ist eine Version w/o handgeschriebene Loops, mit regex & String Ansicht:

static const std::regex expr{ "(\\d)*[a-zA-Z]" }; // zero or more digits + letter 

std::string uncompress(std::string_view const& input) 
{ 
    char what{ '\0' }; 
    unsigned long rep{ 1 }; 

    if (std::regex_match(input.begin(), input.end(), expr)) 
    { 
     char *end = const_cast<char*>(&input.back()) - 1; 
     rep  = 1 == input.size() ? 1 : strtoul(input.data(), &end, 10); 
     what  = input.back(); 
    } 

    return std::string(rep, what); 
} 

Im Demo, kleinere Modifikationen dies erlauben Aufruf während Ihrer Eingabe sucht. Eingabebereinigung wird ebenfalls vorgestellt.

Verwandte Themen