Страницы

Поиск по вопросам

четверг, 28 марта 2019 г.

Почему find не находит пробелы в строке?

Пытаюсь сосчитать количество пробелов в строке, но через find выводит количество всех символов, а не пробелов. Почему и какая есть альтернатива?
for(int d=0;d<=s1.length();d++){ if(s1.find(' ')){ spaces++; } }


Ответ

Для начала у вас задан неверный диапазон цикла
for(int d=0;d<=s1.length();d++){ ^^^
Правильно было бы написать
for ( std::string::size_type d = 0; d < s1.length(); d++ ){ ^^^
То, что делает ваш цикл, это подсчитывает количество символов в строке (если только строка не содержит пробел в самом начале), так как в этом случае условие
if(s1.find(' ')){
всегда будет истинно.
Вы могли бы записать цикл следующим образом
for ( std::string::size_type i = 0; i < s1.length(); i++ ) { if ( s1[i] == ' ' /* || s1[i] == '\t' */ ) ++spaces; }
Или если вы непременно хотите использовать функцию-член класса find, то
for ( std::string::size_type pos = 0; ( pos = s1.find( ' ', pos ) ) != std::string::npos; ++pos ) { spaces++; }
Либо вы можете использовать стандартный алгоритм std::count
spaces = std::count( s1.begin(), s1.end(), ' ' );
Либо вы можете также подсчитывать и другие пробельные символы, как, например, символ табуляции, используя стандартный алгоритм std::count_if и стандартную C функцию isspace
spaces = std::count_if( s1.begin(), s1.end(), ::isspace );
Для этого вам, естественно, помимо прочих заголовков нужно включить заголовки
#include #include
Более корректно будет написать
spaces = std::count_if( s1.begin(), s1.end(), []( char c ) { return ::isspace( ( unsigned char )c ); } );
так как тип char может вести себя как signed char, и в этом случае если среди символов строки могут встречаться символы с отрицательными значениями кодов, то следует делать приведение к типу unsigned char при вызове isspace

Комментариев нет:

Отправить комментарий