修剪/删除字符串中的选项卡(“\ t”)

时间:2009-02-17 10:47:35

标签: c++ string tabs

有人可以建议从字符串中删除制表符(“\ t”s)的方法吗? CString或std :: string。

例如,“1E10”变为“1E10”。

感谢您的期待。

9 个答案:

答案 0 :(得分:20)

如果要删除字符串中的所有出现,则可以使用erase/remove成语:

#include <algorithm>

s.erase(std::remove(s.begin(), s.end(), '\t'), s.end());

如果您只想删除字符串开头和结尾处的标签,可以使用boost string algorithms

#include <boost/algorithm/string.hpp>

boost::trim(s); // removes all leading and trailing white spaces
boost::trim_if(s, boost::is_any_of("\t")); // removes only tabs

如果使用Boost太多开销,您可以使用find_first_not_offind_last_not_of字符串方法滚动自己的修剪函数。

std::string::size_type begin = s.find_first_not_of("\t");
std::string::size_type end   = s.find_last_not_of("\t");

std::string trimmed = s.substr(begin, end-begin + 1);

答案 1 :(得分:19)

hackingwords' answer让你半途而废。但是来自<algorithm>的{​​{3}}实际上并没有使字符串更短 - 它只返回一个迭代器,说“新序列将在这里结束”。您需要致电std::remove()来执行此操作:

#include <string>
#include <algorithm>    // For std::remove()

my_str.erase(std::remove(my_str.begin(), my_str.end(), '\t'), my_str.end());

答案 2 :(得分:6)

remove算法将所有不删除的字符移到开头,覆盖已删除的字符,但不会修改容器的长度(因为它适用于迭代器而不知道底层容器)。要实现此目的,请致电erase

str.erase(remove(str.begin(), str.end(), '\t'), str.end());

答案 3 :(得分:3)

由于其他人已经用std :: string回答了如何做到这一点,这里有你可以用于CString的内容:

myString.TrimRight( '\t' ); // trims tabs from end of string
myString.Trim( '\t' ); // trims tabs from beginning and end of string

如果您想要删除所有标签,即使是字符串中的标签,请使用

myString.Replace( _T("\t"), _T("") );

答案 4 :(得分:2)

扫描字符串并删除所有发现的事件。

答案 5 :(得分:2)

HackingWords几乎就在那里:将erase与remove结合使用。

std::string my_string = "this\tis\ta\ttabbed\tstring";
my_string.erase( std::remove( my_string.begin(), my_string.end(), '\t'), my_string.end());

答案 6 :(得分:1)

CString替换?

  

替换('\ t','')

答案 7 :(得分:0)

首先想法是使用remove

remove(myString.begin(), myString.end(), "\t");

虽然您可能不得不使用remove_if,但该比较不起作用。

答案 8 :(得分:0)

我想知道为什么没有人用这种方式修剪字符串:

void trim (string& s)  {
    string t = "";
    int i = 0;
    while(s[i] == ' ') i++;
    while(s[i] == '\t') i++;
    for(i; i < s.length(); i++)
        t += s[i];

    s = t;
}