C ++ Для подсчета вхождений символа в строку с помощью find (str, index) - PullRequest
1 голос
/ 15 января 2012

Это на самом деле моя домашняя работа, и вопрос гласит:

"Программа должна определить, сколько раз персонаж содержится в строке. (Подсказка: поиск строки с помощью найти (str, ƒind) метод. Этот метод должен использоваться в цикле, который начинает значение индекса с 0, а затем изменяет значение индекса на 1 прошлое индекс того, где символ был последний раз найден.) "

Это то, что я придумал, но все, что он делает, это подсчитывает, сколько символов в строке. Новичок в C ++, так что я надеюсь, что вы, ребята, будете терпеливы со мной.

#include <string>
#include <iostream>
using namespace std;

int main()
{
    string s;
    char c;
    size_t contain;
    int count = 0;
    cout << "Enter a string : ";
    getline(cin, s);
    cout <<"Enter a char : ";
    cin >> c;
    for(int i = 0; i < s.length(); i++)
    {
        contain = s.find(c, i);
        if (contain =! string::npos )
        {
            count++;
        }
    }
    cout << count <<endl;
    return 0;
}

Ответы [ 4 ]

4 голосов
/ 15 января 2012

Вы можете сделать просто:


Вместо

contain = s.find(c, i);
if (contain =! string::npos )
    {
        count++;
    }

запись

if(s[i] == c) 
{
   count++;
}

также, вы можете использовать это.

#include <algorithm>
int count = std::count(s.begin(), s.end(), c);
cout<<count;
4 голосов
/ 15 января 2012

Это:

(contain =! string::npos)
         ^^

не делает то, что вы думаете, что делает. Взгляните на http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B.

Также это:

contain = s.find(c, i);

не делает ничего особенно полезного (если все, что вы делаете, увеличивает i каждую итерацию). В конечном итоге вы посчитаете несколько случаев несколько раз.

[ Примечание: Вы можете гораздо проще решить реальную задачу, используя count = std::count(s.begin(), s.end(), c). ]

3 голосов
/ 15 января 2012

Я думаю, что код @ parapura выглядит так:

while((size_t contain = s.find(c,i)) != string::npos){
    count++;
    i = contain + 1;
}

и это хорошо решает проблему; -)

0 голосов
/ 15 января 2012

Я думаю в соответствии с вашей постановкой проблемы.

изменяет значение индекса на 1 после индекса, где последний раз был найден символ

Ваш цикл while должен выглядеть примерно так:

while( 1 )
{
    contain = s.find(c, i);
    if (contain != string::npos )
    {
        count++;
        i = contain + 1;
    }
    else
    {
        break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...