Wie analysiert man eine komplexe Zeichenfolge mit C ++?
Frage
Ich versuche herauszufinden, wie ich diese Zeichenfolge verwenden kann. "sstream
"und c ++
Das Format davon lautet: "String, int, int".
Ich muss in der Lage sein, den ersten Teil der Zeichenfolge zuzuweisen, der eine IP -Adresse einer STD :: String enthält.
Hier ist ein Beispiel für diese Zeichenfolge:
std::string("127.0.0.1,12,324");
Ich müsste dann bekommen
string someString = "127.0.0.1";
int aNumber = 12;
int bNumber = 324;
Ich werde noch einmal erwähnen, dass ich nicht verwenden kann boost
Bibliothek, gerecht sstream
:-)
Vielen Dank
Lösung
Hier ist eine nützliche Tokenisierungsfunktion. Es wird keine Streams verwendet, kann aber die Aufgabe, die Sie benötigen, durch die Spaltung der Zeichenfolge auf Kommas problemlos ausführen. Dann können Sie mit dem resultierenden Vektor von Token tun, was Sie wollen.
/// String tokenizer.
///
/// A simple tokenizer - extracts a vector of tokens from a
/// string, delimited by any character in delims.
///
vector<string> tokenize(const string& str, const string& delims)
{
string::size_type start_index, end_index;
vector<string> ret;
// Skip leading delimiters, to get to the first token
start_index = str.find_first_not_of(delims);
// While found a beginning of a new token
//
while (start_index != string::npos)
{
// Find the end of this token
end_index = str.find_first_of(delims, start_index);
// If this is the end of the string
if (end_index == string::npos)
end_index = str.length();
ret.push_back(str.substr(start_index, end_index - start_index));
// Find beginning of the next token
start_index = str.find_first_not_of(delims, end_index);
}
return ret;
}
Andere Tipps
Das C ++ String Toolkit Library (STRTK) hat die folgende Lösung für Ihr Problem:
int main() { std::string data("127.0.0.1,12,324"); string someString; int aNumber; int bNumber; strtk::parse(data,",",someString,aNumber,bNumber); return 0; }
Weitere Beispiele finden Sie Hier
Es ist nicht schick, aber Sie können STD :: Getline verwenden, um die Zeichenfolge zu teilen:
std::string example("127.0.0.1,12,324");
std::string temp;
std::vector<std::string> tokens;
std::istringstream buffer(example);
while (std::getline(buffer, temp, ','))
{
tokens.push_back(temp);
}
Dann können Sie die erforderlichen Informationen aus den einzelnen getrennten Zeichenfolgen extrahieren.
Sie könnten auch so etwas tun, glaube ich (total von meinem Kopf, also entschuldige mich, wenn ich dort einige Fehler gemacht habe) ...
stringstream myStringStream( "127.0.0.1,12,324" );
int ipa, ipb, ipc, ipd;
char ch;
int aNumber;
int bNumber;
myStringStream >> ipa >> ch >> ipb >> ch >> ipc >> ch >> ipd >> ch >> aNumber >> ch >> bNumber;
stringstream someStringStream;
someStringStream << ipa << "." << ipb << "." << ipc << "." << ipd;
string someString( someStringStream.str() );