2010-02-27 27 views
6

Ich habe eine Zeichenfolge, die mit vielen Leerzeichen beginnt. Wenn ich die Position des ersten Zeichens herausfinden möchte, das kein Leerzeichen ist, wie würde ich das tun?So finden Sie das erste Zeichen in einer C++ - Zeichenfolge

+2

Welche Codierung ist Ihre Zeichenfolge? Wenn es ASCII ist, dann gibt es nur 4 Leerzeichen, und Vlads Lösung mit find_first_not_of ist gut. ASCII oder Latin 1 Strings decken wahrscheinlich Lehrübungen ab. Wenn Ihre Zeichenfolge UTF-8 oder ein breites Zeichen std :: wstring ist (wie es in einer echten Anwendung sein könnte), stellen Sie eine andere Frage. –

+0

Ja, in diesen Fällen wäre man in der Lage, die 'find_if'-Lösung am unteren Rand des gleichen Posts zu verwenden (optional mit BLL 'boost :: labda :: bind (issspace, _1, my_locale)', um ein bestimmtes Gebietsschema zu binden) my_locale' zu ​​'isspace' anstatt den Standardwert zu verwenden. – vladr

Antwort

15

Siehe std::string::find_first_not_of.

Um den Position (Index) der ersten Nicht-Raumzeichen zu finden:

str.find_first_not_of(' '); 

in die Position (Index) der ersten nicht-leeren Zeichen zu finden:

str.find_first_not_of(" \t\r\n"); 

Er gibt str.npos zurück, wenn str leer ist oder vollständig aus Leerzeichen besteht.

können Sie find_first_not_of verwenden die säumige führende Leerzeichen zu trimmen:

str.erase(0, str.find_first_not_of(" \t\r\n")); 

Wenn Sie wollen, welche Zeichen nicht hart codieren zählen als Rohlinge (zB ein Gebietsschema verwenden) Sie können nach wie vor Gebrauch machen von isspace und find_if in mehr oder weniger die Art und Weise ursprünglich von sbi, aber der Pflege vorgeschlagen isspace, zum Beispiel zu negieren:

string::iterator it_first_nonspace = find_if(str.begin(), str.end(), not1(isspace)); 
// e.g. number of blank characters to skip 
size_t chars_to_skip = it_first_nonspace - str.begin(); 
// e.g. trim leading blanks 
str.erase(str.begin(), it_first_nonspace); 
5

Ich habe nur eine Frage: Brauchen Sie eigentlich die zusätzlichen Leerzeichen?

ich die Macht der Boost.String dort aufrufen würde;)

std::string str1 = "  hello world!  "; 
std::string str2 = boost::trim_left_copy(str1); // str2 == "hello world!  " 

Es gibt viele Operationen (find, trim, replace, ...) sowie Prädikate in dieser Bibliothek verfügbar, wann immer Sie brauchen string Operationen die nicht im Lieferumfang enthalten sind, finden Sie hier. Auch die Algorithmen haben jedes Mal mehrere Varianten (Groß-/Kleinschreibung und Kopie im Allgemeinen).

Verwandte Themen