Обрезать / удалить вкладку ("\ t") из строки - PullRequest
10 голосов
/ 17 февраля 2009

Кто-нибудь может предложить способ удаления символов табуляции ("\ t" s) из строки? CString или std :: string.

Так, например, «1E10» становится «1E10».

Спасибо в ожидании.

Ответы [ 9 ]

20 голосов
/ 17 февраля 2009

Если вы хотите удалить все вхождения в строке, вы можете использовать стирание / удаление идиома:

#include <algorithm>

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

Если вы хотите удалить только вкладку в начале и конце строки, вы можете использовать алгоритмы бустерной строки :

#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_of и find_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);
19 голосов
/ 17 февраля 2009

ответ хакерских слов приведет вас на полпути. Но std::remove() из <algorithm> на самом деле не делает строку короче - она ​​просто возвращает итератор, говорящий «новая последовательность заканчивается здесь». Вам нужно позвонить my_string().erase(), чтобы сделать это:

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

my_str.erase(std::remove(my_str.begin(), my_str.end(), '\t'), my_str.end());
6 голосов
/ 17 февраля 2009

Алгоритм remove перемещает все символы, которые не должны быть удалены, в начало, перезаписывая удаленные символы, но не изменяет длину контейнера (так как он работает на итераторах и не знает основной контейнер). Для этого позвоните erase:

str.erase(remove(str.begin(), str.end(), '\t'), str.end());
3 голосов
/ 17 февраля 2009

Поскольку другие уже ответили, как это сделать с помощью 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("") );
2 голосов
/ 17 февраля 2009

HackingWords почти у цели: используйте стирание в сочетании с удалением.

std::string my_string = "this\tis\ta\ttabbed\tstring";
my_string.erase( std::remove( my_string.begin(), my_string.end(), '\t'), my_string.end());
2 голосов
/ 17 февраля 2009

Сканирование строки и удаление всех найденных случаев.

1 голос
/ 17 февраля 2009

CString заменить?

replace ('\ t', '')

0 голосов
/ 15 декабря 2015

Интересно, почему никто не обрезает строку таким образом:

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;
}
0 голосов
/ 17 февраля 2009

Первой идеей было бы использовать удалить

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

Хотя вам, возможно, придется использовать remove_if, если это сравнение не работает.

...