Обрезать/удалить вкладку ( "\ t" ) из строки

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

Итак, чтобы "1E10      " например, становится "1E10".

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

Ответ 1

ответ hackingwords дает вам на полпути. Но 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());

Ответ 2

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

#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);

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

CString заменить?

replace ('\ t', '')

Ответ 8

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

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

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

Ответ 9

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

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;
}