计算字符串中的尾随空格数

时间:2014-12-22 06:39:05

标签: c++ string

任何人都可以帮助我降低下面代码的复杂性,该代码会计算字符串中尾随空格的数量。

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;
}

3 个答案:

答案 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将为我们做的事情。)