2016-08-04 12 views
3

ich mit der logischen Laufwerke auflisten möchten:
C++ Split-String mit 0 in Liste

const size_t BUFSIZE = 100; 
char buffer[ BUFSIZE ]; 
memset(buffer,0,BUFSIZE); 

//get available drives 
DWORD drives = GetLogicalDriveStringsA(BUFSIZE,static_cast<LPSTR>(buffer)); 

Der Puffer enthält dann: 'C',':','\','0'
The buffer after GetLogicalDriveStringA()
Jetzt habe ich mit "C:\" eine Liste gefüllt haben wollen , "D:\" und so weiter. Daher habe ich so etwas probiert:

std::string tmp(buffer,BUFSIZE);//to split this string then 
QStringList drivesList = QString::fromStdString(tmp).split("\0"); 

Aber es hat nicht funktioniert. Ist es überhaupt möglich, mit dem Delimiter \0 zu teilen? Oder gibt es eine Möglichkeit, nach Länge zu teilen?

+1

Da '\ 0 'beendet die Zeichenfolge, ich denke, Sie es nicht als Trennzeichen verwenden können – wasthishelpful

+1

Die "Liste" zurück von [' GetLogicalDriveStrings'] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa364975(v=vs.85).aspx) ist Double-Nullchar-terminated (in Ihrem Speicheransichts-Snapshot ausgelassen). Sie können also die Zeichenkette über die Längen, die für jedes Segment erhalten werden, unter Verwendung von Schleifen- und Zeigerarithmetik aufzählen, bis Sie auf ein Segment mit der Länge null stoßen. Wenn das passiert, bist du fertig. – WhozCraig

+0

Ja, das war meine erste Annäherung mit 'while (i Drayke

Antwort

5

Das Problem mit String::fromStdString(tmp) ist, dass es eine Zeichenfolge nur aus dem ersten Null-terminierten "Eintrag" in Ihrem Puffer erstellt, weil so Standardzeichenfolgen funktioniert. Es ist sicherlich möglich, aber Sie müssen es stattdessen manuell tun.

Sie können es tun, indem Sie die erste Null, extrahieren Sie die Teilzeichenfolge, dann in einer Schleife, bis Sie zwei aufeinander folgende Nullen finden, tun Sie das gleiche.

Pseudoish-Code:

current_position = buffer; 
while (*current_position != '\0') 
{ 
    end_position = current_position + strlen(current_position); 
    // The text between current_position and end_position is the sub-string 
    // Extract it and add to list 
    current_position = end_position + 1; 
}