• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

String/char usuwanie znaków

Object Storage Arubacloud
0 głosów
3,628 wizyt
pytanie zadane 3 lipca 2017 w C i C++ przez BinaryMan Stary wyjadacz (12,620 p.)

Witam !
Czy orientuje się ktoś czy jest jakaś biblioteka/funkcja która pozwala na taki manewr:
mam sobie zmienną string napis; 

i powiedzmy że siedzi w niej takie coś "    [ <-- 3x spacja ]napis testowy "

I chciałbym aby te 3 spacje z przodu były usunięte, bez ruszania tej spacji która oddziela dwa wyrazy.

Próbowałem przepisać ten string na char i w pętli usuwać te spacje, ale jak dam pętlę do końca tego stringa, to wywala wszystkie spacje i nie mam za bardzo pomysłu co z tym fantem zrobić indecision

Język oczywiście C++
Dziękuję za pomoc i pozdrawiam !

4 odpowiedzi

+2 głosów
odpowiedź 3 lipca 2017 przez mokrowski Mędrzec (155,460 p.)
#include <algorithm>
#include <locale>
#include <string>
#include <iostream>

void ltrim(std::string& s) {
    s.erase(s.begin(), std::find_if_not(s.begin(), s.end(), 
               [](char l) { return std::isspace(l);}));
}

void rtrim(std::string& s) {
    s.erase(std::find_if_not(s.rbegin(), s.rend(),
                [](char l) { return std::isspace(l);}).base(),
            s.end());
}

void trim(std::string& s) {
    rtrim(s);
    ltrim(s);
}

int main() {
    std::string s = " ala ma kota.  ";
    trim(s);
    std::cout << '|' << s << '|' << std::endl;
}

 

komentarz 3 lipca 2017 przez Evelek Nałogowiec (28,960 p.)
Hm... chyba jeszcze #include <cctype> brakuje? Czy może w nowych standardach std::isspace() jest w innym pliku nagłówkowym?

Btw. Mogę Cię mokrowski poprosić o linka do dokumentacji z base()? To co ja znajduję jest strasznie wieloznaczne: http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=base
2
komentarz 3 lipca 2017 przez mokrowski Mędrzec (155,460 p.)
Nie brakuje <cctype>. W <locale> jest drugi isspace z implementacją przeciążeń dla typów znaków.

http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=isspace&button=

http://en.cppreference.com/w/cpp/iterator/reverse_iterator/base
+1 głos
odpowiedź 3 lipca 2017 przez vector Dyskutant (9,200 p.)
edycja 3 lipca 2017 przez vector

Funkcjonalność, której szukasz nie ma w STL'u, aczkolwiek jest w bibliotece zwanej boost. Możesz też napisać własną implementację. Kiedyś miałem podobny problem i napisałem sobie własną funkcję, może Ci się przyda.

std::string trim_left(const std::string &str, const std::string &charset = " ") {
	auto it = str.begin();
	while(it != str.end() && std::find(charset.begin(), charset.end(), *it) != charset.end()) {
		it++;
	}

	return std::string(it, str.end());
}

std::string trim_right(const std::string &str, const std::string &charset = " ") {
	auto it = str.rbegin();
	while(it != str.rend() && std::find(charset.begin(), charset.end(), *it) != charset.end()) {
		it++;
	}

	return std::string(str.begin(), it.base());
}

std::string trim(const std::string &str, const std::string &charset = " ") {
	return trim_left(trim_right(str, charset), charset);
}

 

+1 głos
odpowiedź 3 lipca 2017 przez Szahid Pasjonat (20,930 p.)
Nie musisz używać dodatkowych bibliotek. Wystarczy że użyjesz  metod find() oraz erase().

Pierwsza znajduje znak ( podaje jego pozycje) a druga usuwa znak z podanej pozycji. W podanym przez Ciebie przykładzie wystarczy że w ifie będziesz sprawdzał czy z prawej i lewej strony znajduje się inny znak niż spacja. Jeśli Jeśli tak to nic nie robisz ( continue) jeśli nie to usuwasz
komentarz 3 lipca 2017 przez BinaryMan Stary wyjadacz (12,620 p.)

Okay spróbuje smiley

0 głosów
odpowiedź 3 lipca 2017 przez MetRiko Nałogowiec (37,110 p.)

Co powiesz na to?
Prosta funkcja, a robi robotę ^^
http://rextester.com/FQK52283
(O ile dobrze zrozumiałem o co chodzi.. ale dostosować nie trudno)

Podobne pytania

0 głosów
2 odpowiedzi 3,073 wizyt
pytanie zadane 1 stycznia 2019 w C i C++ przez Drax658 Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 495 wizyt
pytanie zadane 24 czerwca 2017 w C i C++ przez BinaryMan Stary wyjadacz (12,620 p.)
0 głosów
1 odpowiedź 428 wizyt
pytanie zadane 26 stycznia 2020 w C i C++ przez Oskardes Użytkownik (600 p.)

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...