Nicht rekursive Überprüfung des String -Inhalts der variablen Länge
Frage
Ich habe eine Funktion, die ein Zeichen mit variabler Länge und Länge nimmt. Ich möchte überprüfen, ob der Inhalt alle weißen Räume sind.
Es ist eine variable Länge, bedeutet, dass ich kein MEMCMP verwenden kann, weil ich nicht weiß, wie lange ich den zweiten Parameter erwerben kann.
Irgendwelche Gedanken auf eine ordentliche Art, es zu überprüfen, ohne dass es über jeden Charakter der Saite iteriert wird?
Lösung
Eine einigermaßen effiziente Möglichkeit, diese genaue Anforderung zu beantworten, ist:
bool is_whitespace(const char* p, size_t n)
{
while (n--)
if (!isspace(static_cast<unsigned char>(*p++)))
return false;
return true;
}
Allgemeiner ist es eine gute Idee, solche Daten in zu speichern std::string
Variablen, die Lösungen wie Konrads herstellen find_first_not_of
effizienter und bequemer.
*Vielen Dank an Steve für den Kommentar, der auf einigen Plattformen mit Nicht-ASCII-String-Inhalten nachkommt ... z. B. http://msdn.microsoft.com/en-us/library/ms245348.aspx.
Andere Tipps
Gehen Sie einfach über die Gabel und prüfen Sie nach Whitespace (zB mit der isspace
Funktion).
Alternativ konvertieren Sie die char*
zu einem std::string
und verwenden Stringfunktionen, dh find_first_not_of
. Beispielsweise verwenden Sie die „konventionellen“ Whitespace-Zeichen in vor-Unicode-Codierungen:
bool is_all_spaces(char const* text, unsigned len) {
string str(text, len);
return str.find_first_not_of(" \t\r\n\v\f") == string::npos;
}
Eine ausgefallenere Weißespace -Erkennung würde mit willkürlichen Textcodierungen / Lokalen umgehen. Aus diesem Grund verwenden Sie isspace
ist wahrscheinlich dem überlegen gegenüber der find_first_not_of
sich nähern.
In jedem Fall verwenden memcmp
In C ++ wird sowieso schlecht beraten und Sie sollten im Allgemeinen C ++ -Schitribünen gegenüber C-Arrays im C-Stil vorziehen.
Wenn Sie wissen möchten, ob ein bestimmtes Zeichen in einer Zeichenfolge einen bestimmten Wert hat und Sie das für alle Zeichen in der Zeichenfolge wissen möchten, Sie sind Sie brauchen um über die Schnur zu iterieren. Auf keinen Fall um das herum. Eben memcmp
Schleifen über der Saite, es ist nur vor dir versteckt.
Bearbeiten: Ich dachte, ich würde eine einfache Implementierung für Zeichenfolgen variabler Länge anbieten:
bool is_only_space(const char* str){
while(*str != '\0'){
if(*str != ' ')
return false;
++str;
}
return true;
}
Dies funktioniert natürlich nur für Null-terminierte Zeichenfolgen, aber das sollte selbstverständlich sein.