关闭

[C/C++]_[初级]_[Trim掉字符串的前后空格]

标签: trim移除前后空格stringC++
2125人阅读 评论(0) 收藏 举报
分类:

场景

  1. C++ 字符串Trim空格一直不在标准库里, 但是又很常用, 比如在界面输入一些字符串需要过滤掉前后空格后保存到数据库里;又或者需要进行字符串比较时过滤掉前后空格来精确比较都需要用到Trim方法.

  2. Object-c的NSString有自己的一个方便的方法实现Trim行为.

text = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]
  1. Java 的String也有自己的 trim()方法,确实 C++的字符串库我感觉可以模仿Java API 写成对应的标准库了.
import java.io.*;

public class Test{
   public static void main(String args[]){
      String Str = new String("   Welcome to Tutorialspoint.com   ");

      System.out.print("Return Value :" );
      System.out.println(Str.trim() );
   }
}
  1. 之前写过一些Trim的C++函数,但是都不够精炼. 先参考 使用模板删除字符串前后空格((w)string space) 看以前写的实现是不是很冗余.再看现在的实现, 是否是发现很精简? 可惜的是使用模板必须是头文件. Trim后边的空格使用reverse_iterator, 很精巧.
template<class T>    
T& LTrim(T& t)
{
    t.erase(t.begin(),
        std::find_if(t.begin(),t.end(),[](int i)->bool{return !isspace(i & 0xFF);}));
    return t;
}

template<class T>    
T& RTrim(T& t)
{
    t.erase(std::find_if(t.rbegin(),t.rend(),[](int i)->bool{return !isspace(i & 0xFF);}).base(),t.end());
    return t;
}

template<class T> 
T& Trim(T& t)
{
    return RTrim(LTrim(t));
}

例子

  1. 顺便提醒下& 0xFF是为了过滤掉 > 255的字符, 比如wstring占用了两字节,在Windows下, > 255 的int 调用isspace会崩溃.
  2. std::reverse_iterator::base 的意思是返回一个当前 reverse_iterator 内部表示的 iterator,这样和erase的第2个参数.end()才能匹配. 而且用枚举对象不用担心下标越界问题.

#include "stdafx.h"
#include <iostream>  
#include <algorithm>
#include <stdlib.h>  
#include <string.h>  
#include <assert.h>
#include <string>  
#include <ctype.h>  

using namespace std;  

template<class T>    
T& LTrim(T& t)
{
    t.erase(t.begin(),
        std::find_if(t.begin(),t.end(),[](int i)->bool{return !isspace(i & 0xFF);}));
    return t;
}

template<class T>    
T& RTrim(T& t)
{
    t.erase(std::find_if(t.rbegin(),t.rend(),[](int i)->bool{return !isspace(i & 0xFF);}).base(),t.end());
    return t;
}

template<class T> 
T& Trim(T& t)
{
    return RTrim(LTrim(t));
}

void TestTrimString()  
{  

    string wstr;  
    string wres;  
    wstr = "asdfasd 990";
    Trim(wstr);  
    assert(wstr == "asdfasd 990");

    wstr = "asdfasd 990 ";  
    Trim(wstr);  
    assert(wstr == "asdfasd 990");

    wstr = " asdfasd 990";  
    Trim(wstr);  
    assert(wstr == "asdfasd 990");

    wstr = " asdfasd 990 ";  
    Trim(wstr);  
    assert(wstr == "asdfasd 990");

    wstr = "";  
    Trim(wstr);  
    assert(wstr == "");

    wstr = " ";  
    Trim(wstr);  
    assert(wstr == "");

    wstr = "\0";  
    Trim(wstr);  
    assert(wstr == ""); 

    std::wstring w(L" hello ");
    Trim(w);
    assert(w == L"hello");
} 

int main(int argc, char const *argv[])  
{  
    TestTrimString();
    system("pause");
    return 0;  
}  

参考

whats-the-best-way-to-trim-stdstring
basic_string
can-i-convert-a-reverse-iterator-to-a-forward-iterator
std::reverse_iterator::base
使用ctype里的isxxx函数时要注意的事项

0
0
查看评论

[C/C++标准库]_[初级]_[使用模板删除字符串前后空格((w)string space)]

1. C++没有提供删除std::(w)string的前后空格的函数,比如TrimSpace. 2. 很多库都提供, 但是为了移植代码方便,最好还是能用标准库解决就用标准库.
  • infoworld
  • infoworld
  • 2014-12-17 14:54
  • 2199

C/C++ / string 字符串去掉左右空格

以下代码摘抄CSDN论坛: 源文连接在:http://topic.csdn.net/u/20110620/10/1e0e91f0-1440-45db-aa29-6ce618fec2da.html 本人目的只在于收藏; C方法: [cpp] view plain...
  • shuyun123456789
  • shuyun123456789
  • 2014-09-22 17:06
  • 2181

C语言 trim 函数

实现C语言中用于对字符串的trim处理 #include #include void trim(char *s) { char *start; char *end; int len = strlen(s); start = s; ...
  • dengxu11
  • dengxu11
  • 2012-03-05 09:46
  • 6542

C语言实现的trim函数str_trim

#include #include   char * str_trim_len(char * input, int len) {     char *head=input;     char *tail=input...
  • crazycoder8848
  • crazycoder8848
  • 2013-01-05 21:07
  • 2780

C++ string的trim, split方法

很多其他语言的libary都会有去除string类的首尾空格的库函数,但是标准C++的库却不提供这个功能。但是C++string也提供很强大的功能,实现trim这种功能也不难。下面是几种方法:     1.使用string的find_first_not_of,和find...
  • Butterfly_Dreaming
  • Butterfly_Dreaming
  • 2013-08-21 13:04
  • 100729

C++ string 的 trim 函数

参考: http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring http://www.cppblog.com/cc/archive/2007/08/09/29667.html 代码...
  • yasi_xi
  • yasi_xi
  • 2013-07-01 17:02
  • 8386

C++实现Trim函数

#include using namespace std; //code in codeblocks string trim(string s){ if(s.empty()) return s; s.erase(0,s.find_first_not_of("...
  • u012662688
  • u012662688
  • 2016-08-02 09:53
  • 1138

C语言去除字符串首尾空格,trim()函数实现

C语言中目前没有现成的trim函数,自己实现了一个。 #include #include #include #include //去除尾部空格 char *rtrim(char *str) { if (str == NULL || *str == '\0') { ...
  • u013022032
  • u013022032
  • 2016-01-15 08:47
  • 1745

trim()去掉空格

protected void Button1_Click(object sender, EventArgs e)     {         SqlConnection sqlconn = Connection.GetConn(); ...
  • gz153016
  • gz153016
  • 2016-03-05 21:53
  • 1592

去除C++String的首尾空格

 #include     #include     #include     #include     using   namespace   std;  inline &...
  • kaizi318
  • kaizi318
  • 2014-07-15 18:42
  • 8546
    个人资料
    • 访问:944266次
    • 积分:11702
    • 等级:
    • 排名:第1549名
    • 原创:279篇
    • 转载:18篇
    • 译文:2篇
    • 评论:156条
    任务
    1. 阅读 《加密与解密》并总结 (2017年).
    QQ: 632994155
    搜索
    博客专栏
    最新评论