MervDePerv

maj 12, 2010

trim() w c++

Opublikowane jako: C/C++ — naza @ 9:41 po południu

Jak podaje wiki nie ma standardowej funkcji trimującej dla C/C++. Nie zastanawiałem się nad tym ponieważ zarówno w Builder C++ oraz C# takie funkcje są w standardzie. Jestem na tyle leniwy, że nie chciało mi się pisać czegoś od początku dlatego postanowiłem poszukać funkcji trim() napisanej w C/C++ w internecie. Ku mojemu zdziwieniu przyprawia to wiele problemów dlatego postanowiłem przyjrzeć się problemowi bliżej. Można oczywiście użyć darmowych bibliotek boost czy QT. Tylko po co do prościutkiego programu dodawać w/w biblioteki. W wielu miejscach spotkałem się z tym by używać funkcji remove() aczkolwiek usunie nam ona tylko spacje i tabulatory z prawej i lewej strony. Można się bawić w łączenie ciągów, przesuwanie wskaźników itp. Ku mojemu zdziwieniu rozwiązanie jest bardzo proste. Najlepiej użyć właśnie remove() z drobną modyfikacją. Poniżej przedstawiam moje gotowe rozwiązanie z komentarzem:

#include <string>
#include <iostream>

using namespace std;

string trim(string str)
{
  int i=0;
  /*
      Wyznaczenie liczby znaków, które nie są spacją
      lub tabulatorem.
  */
  for(int x=0;str[x]!='';x++) if(str[x]!=' ' && str[x]!='\t') i++;
  /*
      Usunięcie spacji i tabulatorów z prawej i lewej strony.
  */
  remove(str.begin(), str.end(), ' ');
  remove(str.begin(), str.end(), '\t');
  /*
      Zwrócenie ciągu bez spacji i tabulatorów.
      Gdybysmy tego nie zrobili to po użyciu funkcji
      remove() otrzymamy wytrimowany ciąg uzupełniony
      do jego pierwotnej długości o krzaczki. :)
  */
  return str.substr(0, i);
}

int main()
{
 cout << "trim2 : _" << trim("\t\t  123456\t\t  :  \t 7890     \t") << "_" << endl;
 return 0;
}

Leave a Reply

Wspierane przez NETMARK Hosting