2014-12-22 2 views
0

Может ли кто-нибудь помочь мне в уменьшении сложности кода ниже, в котором подсчитывается количество завершающих пробелов в строке.Подсчитайте число пробелов в пустой строке в строке

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

Если ваш код работает должным образом, и вы хотите, чтобы ваш код был пересмотрен, возможно, наиболее подходящим местом является http://codereview.stackexchange.com/. Спасибо. –

+1

cout ясно известно, что это C++-программа. почему тег 'c' ??? – sharon

+0

Возьмите одну целую переменную для длины url, не используйте 'url.length();' in for loop. – Himanshu

ответ

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

Я думаю, это должно быть 'int i = url.length() - 1; i> = 0; ' – Himanshu

+0

да, у вас есть идея, не используйте C++ некоторое время – Moes

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

Мы можем сделать это без реверсирования строки, так и без использования функции C, как strspn. Например, найдите функцию 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_ofstring::npos который только (size_t) -1, наибольшее значение size_t. Когда это вычитается из длины, а затем вычитается 1, результирующее значение равно только длине. Арифметика работает во всех случаях.

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).

После этого возвращенный итератор укажет на непространственный символ, поэтому нужно просто знать «расстояние» между этой точкой и концом (это то, что будет делать для нас std::distance).

Смежные вопросы