2016-10-13 4 views
0

Ich implementiere eine Python wie split() Funktion in C++, um mich zu trainieren. Ich habe die Idee von diesem SO thread: Parse (split) a string in C++ using string delimiter (standard C++)Seltsames Verhalten in der Deklaration innerhalb einer Weile C++

In diesem Code:

while ((pos = s.find(delimiter)) != std::string::npos) { 
    token = s.substr(0, pos); 
    std::cout << token << std::endl; 
    s.erase(0, pos + delimiter.length()); 
} 

Der Wert o pos innerhalb des Zustandes der while Schleife zugeordnet ist.

habe ich versucht, das Gleiche:

#include <iostream> 
#include <string> 
#include <algorithm> 
#include <vector> 

std::vector<std::string> split(std::string inp, std::string delimeter){ 
    std::vector<std::string> res; 
    while (size_t pos = inp.find(delimeter) <= inp.length()){ 
     std::cout << inp << " " << pos << std::endl ; 
     if (inp.substr(0, delimeter.length()) == delimeter) { 
      inp.erase(0, delimeter.length()); 
      continue; 
     } 
     res.push_back(inp.substr(0, pos)); 
     inp.erase(0, pos); 
    } 
    return res; 
} 

int main() { 
    for (auto i : split(",,ab,c,,d", ",")){ 
     std::cout << i << " "; 
    } 
    std::cout << std::endl; 
} 

Meine Ausgabe ist:

,,ab,c,,d 1 
,ab,c,,d 1 
ab,c,,d 1 
b,c,,d 1 
,c,,d 1 
c,,d 1 
,,d 1 
,d 1 
a b c 

Meine Frage ist, warum es poes sagen, dass die Position von , in String ,,ab,c,,d 11 ist?

Und warum ist die Position in ab,c,,d auch 1?

ich den Code wie folgt geändert:

#include <iostream> 
... 
    size_t pos = 0; 
    while (pos <= inp.length()){ 
     pos = inp.find(delimeter); 
     ... 
} 

int main() { 
    for (auto i : split(",,ab,c,,d", ",")){ 
     std::cout << i << " "; 
    } 
    std::cout << std::endl; 
} 

Wo ... unverändert bleibt und jetzt funktioniert es wie ein Zauber, der Ausgang ist:

,,ab,c,,d 0 
,ab,c,,d 0 
ab,c,,d 2 
,c,,d 0 
c,,d 1 
,,d 0 
,d 0 
d 18446744073709551615 
ab c d 

So wie ich erwartet hatte.

Also meine Frage ist: Warum kann ich nicht eine Variable innerhalb einer Weile zu deklarieren? Wird die Bedingung nicht bei jedem Zyklus ausgewertet (die Deklaration passiert also wieder?). Schon im ersten Zyklus bekomme ich das Ergebnis 1 was falsch ist. Warum das?

+4

Ihre Aussage zum ersten Codebeispiel ist falsch. Und das macht die Frage verwirrend! 'pos' wurde vor der Schleife deklariert. – juanchopanza

+0

Im ersten Code wird 'pos' nicht in der for-Schleife deklariert. es wird irgendwo davor deklariert, wie es sein sollte. – NathanOliver

+0

"Warum kann ich eine Variable nicht innerhalb einer bestimmten Zeit deklarieren?" Sie können. Denken Sie daran, dass der Gültigkeitsbereich der Variablen bei jeder Iteration der Schleife zurückgesetzt wird – UKMonkey

Antwort

5
while (size_t pos = inp.find(delimeter) <= inp.length()){ 

als

interpretiert
while (size_t pos = (inp.find(delimeter) <= inp.length())){ 

, während Sie eine ganz andere Gruppierung benötigen

while ((size_t pos = inp.find(delimeter)) <= inp.length()){ 

Letztere in C++ illegal ist though.

Es ist nicht möglich, eine Variable in der while Bedingung zu deklarieren und sie gleichzeitig an einem komplizierteren Bedingungsausdruck teilnehmen zu lassen (wie ein Vergleich mit einem anderen Wert). Wenn Sie eine Variable in C++ - Bedingung deklarieren, ist nur der Anfangswert in bool konvertiert.

Der modifizierte Code, in dem pos vor der Schleife deklariert ist, implementiert Ihre Absicht richtig.

+0

Also habe ich einen Zustand überprüft und einen Böllen bekommen. 1. Das erklärt es, und es ist so klar .. Ich saß nur für eine Stunde hier um es herauszufinden. Vielen Dank, ich werde das so bald als korrekt markieren so wie ich kann (10 Minuten) –