我知道在Java和C中有几种很好的方法可以做到这一点,但在C++中,我似乎找不到一种方法来轻松实现字符串修剪函数。
这是我目前拥有的:
string trim(string& str)
{
size_t first = str.find_first_not_of(' ');
size_t last = str.find_last_not_of(' ');
return str.substr(first, (last-first+1));
}
字符串
但每次我打电话
trim(myString);
型
我得到编译器错误
/tmp/ccZZKSEq.o: In function `song::Read(std::basic_ifstream<char,
std::char_traits<char> >&, std::basic_ifstream<char, std::char_traits<char> >&, char const*, char const*)':
song.cpp:(.text+0x31c): undefined reference to `song::trim(std::string&)'
collect2: error: ld returned 1 exit status
型
我试图找到一种简单而标准的方法来修剪字符串中的前导和尾随空格,而不需要占用100行代码,我尝试使用正则表达式,但无法正常工作。
我也不能使用Boost。
7条答案
按热度按时间3b6akqbq1#
你的代码很好。你看到的是一个链接器问题。
如果你把你的代码放在一个像这样的文件中:
字符串
然后做
g++ test.cc
并运行a.out,你会看到它工作。您应该检查包含
trim
函数的文件是否包含在编译过程的链接阶段中。yvt65v4c2#
以下是您可以做到的方法:
字符串
支持功能实现为:
型
一旦你把这些都写好了,你也可以这样写:
型
试试这个
idfiyjo83#
我认为如果str只包含空格,substr()会抛出异常。
我将其修改为以下代码:
字符串
yshpjwxd4#
使用正则表达式
字符串
归功于:https://www.regular-expressions.info/examples.html用于正则表达式
正如@o_oTurtle提到的-正则表达式非常慢。
另一种方法包括额外的空白字符:
型
zqry0prt5#
字符串
iqih9akk6#
除了@gjha的回答:
字符串
ar5n3qh57#
带测试的解决方案
有些令人惊讶的是,这里的答案都没有提供一个测试函数来演示
trim
在极端情况下的行为。空字符串和完全由空格组成的字符串都很麻烦。下面是这样一个函数:
字符串
测试接受的解决方案
当我在2023-Aug-05对公认的答案运行这个时,我对它如何处理完全由空格组成的字符串感到失望。我希望它们被修剪成空字符串。相反,它们被原封不动地返回。if语句是原因。
型
下面是我的测试输出:
型
测试trim的“新改进”版本
为了让它按照我想要的方式工作,我修改了if语句。
在此期间,我删除了
using namespace std;
,并将参数名更改为s
。你知道,因为我可以。型
现在测试例程产生了我喜欢的输出:
型