Skip to main content
Email Password   helpLost your password?

Introduction

The C++ Standard Template Library (STL, for short) provides the handy std::string class, which provides a lot of common string facilities. However, the well-known trim operation was not implemented. The trim operation consists of removing all unused spaces placed before and after the characters into a string. For example, let's say you have a textbox in a program where the user should type their name. Then, the user types the following:

"  Rodrigo C Dias "

It would be interesting if you could remove the spaces before and after the name if, for example, you are about to include this string in a database. In this article, we will discuss two easy implementations of trim, both applied to the std::string class.

First implementation

In this first implementation, the idea is to extract the substring within the string, so we have just what interests. The code is shown below:

void trim1(string& str)
{
  string::size_type pos1 = str.find_first_not_of(' ');
  string::size_type pos2 = str.find_last_not_of(' ');
  str = str.substr(pos1 == string::npos ? 0 : pos1, 
    pos2 == string::npos ? str.length() - 1 : pos2 - pos1 + 1);
}

Really simple, isn't it?

Second implementation, faster

The second implementation is faster, as you can see yourself if you perform some benchmarks as I did. The idea here is to search the string for the last character before the last space characters. If none is found, then the string is composed only of spaces, so it's completely erased (logical, isn't it?). Else we remove the spaces at the end of the string, based on the found index.

Next step, we search for the first character different from space. Then we remove everything before it. The code of this implementation is shown below:

void trim2(string& str)
{
  string::size_type pos = str.find_last_not_of(' ');
  if(pos != string::npos) {
    str.erase(pos + 1);
    pos = str.find_first_not_of(' ');
    if(pos != string::npos) str.erase(0, pos);
  }
  else str.erase(str.begin(), str.end());
}

This implementation is faster because we have two calls to erase, instead of a string copy (more expensive).

Conclusion

The trim method may be very useful sometimes, and we discussed an implementation of a good one if we are working with the std::string class. Below is the simplest example of how to use it, dealing with the previously given input:

std::string name = "  Rodrigo C Dias ";
trim2(name);

And that's all.

You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
GeneralUsing pointer arithmetic Pin
PaterArepo
17:01 27 Dec '07  
Questionwhy do you need those 'npos' checks Pin
SUID
0:30 26 Jul '07  
GeneralImplementation trim1() is broken Pin
gubespam
13:15 22 May '07  
GeneralRe: Implementation trim1() is broken Pin
Rodrigo C. Dias
7:51 23 May '07  
GeneralLicense to use the code Pin
sharongnt
23:04 25 Dec '06  
GeneralRe: License to use the code Pin
Rodrigo C. Dias
1:29 26 Dec '06  
GeneralPerfect Pin
Aaron Planell
2:42 20 Sep '06  
GeneralAnother one (very simple) Pin
Richard Lin
7:07 12 Jul '05  
GeneralRe: Another one (very simple) Pin
Rodrigo C. Dias
1:30 26 Dec '06  
GeneralRe: Another one (very simple) Pin
paraplaner12
0:11 16 Jul '07  
GeneralSimilar implementation Pin
berserker_r
22:25 3 Jul '05  
GeneralRe: Similar implementation Pin
CP Visitor
0:27 5 Jul '05  
GeneralRe: Similar implementation Pin
Nathan Lewis
17:11 6 Apr '06  
GeneralRe: Similar implementation Pin
Snakefoot
14:27 20 Oct '09  
GeneralBoost string algorithms library Pin
Nemanja Trifunovic
15:16 3 Jul '05  
GeneralRe: Boost string algorithms library Pin
Rodrigo C. Dias
17:39 3 Jul '05  
GeneralRe: Boost string algorithms library Pin
Anonymous
2:07 4 Jul '05  
GeneralRe: Boost string algorithms library Pin
Nemanja Trifunovic
2:47 4 Jul '05  
GeneralRe: Boost string algorithms library Pin
setori88
0:32 30 Nov '07  


Last Updated 3 Jul 2005 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2009