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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top