Определение функции в целом неверно.
Например, если данный символ не найден, то почему функция возвращает 0, которое является допустимой позицией?
Возвращает значение first=i+1;
будет только сбивать с толку пользователей функции. Функция должна возвращать std::string::npos
, если данный символ не найден.
Также совершенно неясно, почему l oop начинается с конца строки, а вам нужно вернуть первую позицию символа .
Что касается бесконечного l oop, то в l oop используется переменная i
с целым типом без знака std::string::size_type
, значение которого никогда не может быть отрицательным.
for(auto i=str.size()-1;i>=0;i--)
^^^^^^^^^^^^^^^^^^^
Это условие i >= 0
всегда верно по определению.
Функция должна быть определена следующим образом
std::pair<std::string::size_type, std::string::size_type> find_ch( const std::string &str, char ch )
{
auto n = str.find( ch );
std::pair<std::string::size_type, std::string::size_type> p( n, 0 );
if ( n != std::string::npos )
{
++p.second;
while ( ( n = str.find( ch, n + 1 ) ) != std::string::npos ) ++p.second;
}
return p;
}
Вот демонстрационная программа.
#include <iostream>
#include <string>
#include <utility>
std::pair<std::string::size_type, std::string::size_type> find_ch( const std::string &str, char ch )
{
auto n = str.find( ch );
std::pair<std::string::size_type, std::string::size_type> p( n, 0 );
if ( n != std::string::npos )
{
++p.second;
while ( ( n = str.find( ch, n + 1 ) ) != std::string::npos ) ++p.second;
}
return p;
}
int main()
{
std::string s( "C++ is not the same as C" );
auto p = find_ch( s, 'C' );
if ( p.first != std::string::npos )
{
std::cout << p.first << ": " << p.second << '\n';
}
return 0;
}
Вывод программы:
0: 2
Если вам не разрешено использовать методы класса std :: string, тогда просто подставьте вызовы метода find из функции выше в while петли, как показано ниже.
#include <iostream>
#include <string>
#include <utility>
std::pair<std::string::size_type, std::string::size_type> find_ch( const std::string &str, char ch )
{
std::pair<std::string::size_type, std::string::size_type> p( std::string::npos, 0 );
std::string::size_type n = 0;
while ( n < str.size() && str[n] != ch ) ++n;
if ( n != str.size() )
{
p.first = n;
++p.second;
while ( ++n != str.size() )
{
if( str[n] == ch ) ++p.second;
}
}
return p;
}
int main()
{
std::string s( "C++ is not the same as C" );
auto p = find_ch( s, 'C' );
if ( p.first != std::string::npos )
{
std::cout << p.first << ": " << p.second << '\n';
}
return 0;
}