Пытаюсь сосчитать количество пробелов в строке, но через 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
Более корректно будет написать
spaces = std::count_if( s1.begin(), s1.end(),
[]( char c ) { return ::isspace( ( unsigned char )c ); } );
так как тип char может вести себя как signed char, и в этом случае если среди символов строки могут встречаться символы с отрицательными значениями кодов, то следует делать приведение к типу unsigned char при вызове isspace
Комментариев нет:
Отправить комментарий