Может ли кто-нибудь предложить способ удаления символов вкладок ( "\ t" s) из строки? CString или std::string.
Итак, чтобы "1E10 " например, становится "1E10".
Спасибо в ожидании.
Может ли кто-нибудь предложить способ удаления символов вкладок ( "\ t" s) из строки? CString или std::string.
Итак, чтобы "1E10 " например, становится "1E10".
Спасибо в ожидании.
ответ 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());
Если вы хотите удалить все вхождения в строке, вы можете использовать удалить/удалить идиому:
#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);
Алгоритм remove
сдвигает все символы, которые не должны быть удалены до начала, переписывание удаленных символов, но не изменяет контейнер length (поскольку он работает с итераторами и не знает базовый контейнер). Для этого вызовите erase
:
str.erase(remove(str.begin(), str.end(), '\t'), str.end());
Поскольку другие уже ответили, как это сделать с помощью 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("") );
Сканировать строку и удалить все найденные вхождения.
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') );
CString заменить?
replace ('\ t', '')
Первой идеей было бы использовать remove
remove(myString.begin(), myString.end(), "\t");
Хотя вам, возможно, придется использовать remove_if, если это сравнение не работает.
Интересно, почему никто не обрезает строку таким образом:
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;
}