任何人都可以帮助我降低下面代码的复杂性,该代码会计算字符串中尾随空格的数量。
void main()
{
string url = "abcd ";
int count = 1;
for (int i = 0; i < url.length(); i++)
{
if (url.at(i) == ' ')
{
for (int k = i + 1; k < url.length(); k++)
{
if (url.at(k) != ' ')
{
count = 1;
break;
}
else
{
count++;
i++;
}
}
}
}
cout<< count;
}
答案 0 :(得分:2)
#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
string url = "abcd "; // four spaces
string rev = url;
reverse(rev.begin(), rev.end());
cout << "There are " << strspn(rev.c_str(), " ") << " trailing spaces." << endl;
return 0;
}
我们可以在不反转字符串的情况下执行此操作,并且不使用像strspn
这样的C函数。例如,查找string::find_last_not_of
函数。它将找到字符串中不在指定集合中的最后一个字符,并返回其位置。如果你的集合是" "
(空格)集,那么它会找到最后一个非空格字符。该位置与字符串长度之间的差异是尾随空格的计数。
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main()
{
string url = "abcd "; // four spaces
size_t last_nonspace = url.find_last_not_of(" ");
cout << "There are " << url.length() - last_nonspace - 1 << " trailing spaces." << endl;
return 0;
}
请注意,如果字符串中没有非空格字符(字符串为空或仅包含空格),则find_last_not_of
函数将返回仅string::npos
的{{1}}, (size_t) -1
的最大值。当从长度中减去该值,然后减去1时,结果值就是长度。算术在所有情况下都有效。
答案 1 :(得分:1)
开始向后计算空白区域
void main() {
string url = "abcd ";
int count = 0;
for (int i = url.length(); i > 0; i--) {
if (url.at(i) == ' ') {
count++;
} else {
break;
}
}
cout<< count;
}
答案 2 :(得分:0)
您可以使用find_if()算法函数来执行此操作:
#include <algorithm>
#include <string>
#include <cctype>
#include <iostream>
using namespace std;
int main()
{
string s = "This string has spaces at the end ";
string::iterator it =
find_if(s.rbegin(), s.rend(), [](char ch) { return !isspace(ch); }).base();
cout << "The number of trailing spaces is " << std::distance(it, s.end());
}
基本上我们从字符串的结尾开始,让find_if()找到第一个非空格字符(我使用isspace
而不是硬编码的32)。
之后,返回的迭代器将指向非空格字符,因此只需知道&#34;距离&#34;在该点与结束之间(这是std::distance
将为我们做的事情。)