【发布时间】:2009-02-17 10:47:35
【问题描述】:
谁能建议一种从字符串中去除制表符 ("\t"s) 的方法? CString 或 std::string。
例如“1E10 ”变成“1E10”。
【问题讨论】:
-
你的意思是从头开始还是从头开始?或者从字符串中的任何地方? “abc\tdef”应该保持原样,还是简化为“abcdef”?
-
我应该更清楚一点,我的意思是从字符串中的任何地方。
谁能建议一种从字符串中去除制表符 ("\t"s) 的方法? CString 或 std::string。
例如“1E10 ”变成“1E10”。
【问题讨论】:
hackingwords' answer 让你成功了一半。但是来自<algorithm> 的std::remove() 实际上并没有使字符串更短——它只是返回一个迭代器,说“新序列将在此处结束”。您需要致电 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());
【讨论】:
如果你想删除字符串中的所有出现,那么你可以使用erase/remove idiom:
#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_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(a, b, v) 完全等于 stable_partition(a, b, p) 谓词 p = _1 != value。
remove 只是将其他元素移到前面,它不会将已删除的元素移到后面。所以,是的,你一直都是对的。但我必须先对其进行测试:pastie.org/396239 所以,感谢您的坚持!
由于其他人已经回答了如何使用 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(), '\t'), my_string.end());
【讨论】:
CString 替换?
替换('\t', '')
【讨论】:
【讨论】:
我想知道为什么没有人这样修剪字符串:
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;
}
【讨论】: