C++ C++;STD发现最后一次不工作?

C++ C++;STD发现最后一次不工作?,c++,string,std,C++,String,Std,我正在尝试编写一个函数来清除字符串前面或后面的空格 因此,基本上,如果您通过函数“\t这是一个测试!\t”,那么它必须返回“您好,这是一个测试!”。这是我的密码,但是 string clean_str(string str) { const string alphabet("abcdefghijklmnopqrstuvwxyz1234567890åäö-"); size_t first = str.find_first_of(alphabet); size_t last

我正在尝试编写一个函数来清除字符串前面或后面的空格

因此,基本上,如果您通过函数
“\t这是一个测试!\t”
,那么它必须返回
“您好,这是一个测试!”
。这是我的密码,但是

string clean_str(string str)
{
    const string alphabet("abcdefghijklmnopqrstuvwxyz1234567890åäö-");

    size_t first = str.find_first_of(alphabet);
    size_t last = str.find_last_of(alphabet);
    return str.substr(first, last);
}

int _tmain(int argc, _TCHAR* argv[])
{
    string s("         test 123-4    ");
    cout << "[" << clean_str(s) << "]";
    Sleep(INFINITE);
    return 0;
}
这是错误的。我已经决定使用Boost,但我仍然想知道为什么它不起作用


谢谢。

问题是的第二个参数-它应该是子字符串中字符数的计数。这意味着你应该:

return str.substr(first, last - first + 1);
确保您始终阅读所使用函数的文档(可能直到您熟记为止)。

使用以下内容

return ( first == std::string::npos ? "" : str.substr(first, last + 1 - first ) );

第二个参数指定应提取的字符数。

基本问题是
std::string
来自与STL不同的库。所以它有非常不同的接口约定。@Yakk
std::string
是一团乱麻。哦,如果字符串是
“a”
,上面返回的是空字符串。哎呀,我没注意到。你是对的,这是你有时会得到的那种傲慢。无视所有简单的事情。谢谢!@雅克:当然,他应该检查first==last.@Vlad不太清楚。对于作为输入的“a”
first
last
均为0。但结果字符串应为“a”。@TobiMcNamobi您是对的。第一个和最后一个必须与非营利组织进行比较。我将在我的帖子上注明日期。
return ( first == std::string::npos ? "" : str.substr(first, last + 1 - first ) );