Подтвердить что ты не робот

Подсчет вхождений символов в строке в С++

Как я могу подсчитать количество "_" в строке типа "bla_bla_blabla_bla"?

4b9b3361

Ответ 1

#include <algorithm>

std::string s = "a_b_c";
size_t n = std::count(s.begin(), s.end(), '_');

Ответ 2

псевдокод:

count = 0
For each character c in string s
  Check if c equals '_'
    If yes, increase count

EDIT: код примера С++:

int count_underscores(string s) {
  int count = 0;

  for (int i = 0; i < s.size(); i++)
    if (s[i] == '_') count++;

  return count;
}

Обратите внимание, что этот код используется вместе с std::string, если вы используете char*, замените s.size() на strlen(s).

Также обратите внимание: я понимаю, что вы хотите что-то "как можно меньше", но я бы предложил вам использовать это решение. Как вы видите, вы можете использовать функцию для инкапсуляции кода для вас, поэтому вам не придется писать цикл for каждый раз, но можете просто использовать count_underscores("my_string_") в остальной части вашего кода. Использование продвинутых алгоритмов на С++, конечно, возможно здесь, но я думаю, что это чрезмерно.

Ответ 3

Старомодное решение с правильно названными переменными. Это дает коду некоторый дух.

#include <cstdio>
int _(char*__){int ___=0;while(*__)___='_'==*__++?___+1:___;return ___;}int main(){char*__="_la_blba_bla__bla___";printf("The string \"%s\" contains %d _ characters\n",__,_(__));}

Редактировать: около 8 лет спустя, глядя на этот ответ, мне стыдно, что я сделал это (хотя я оправдал это для себя как язвительный удар по вопросу с минимальными усилиями). Это токсично и не в порядке. Я не удаляю почту; Я добавляю это извинение, чтобы помочь изменить атмосферу в StackOverflow. Итак, ОП: Я прошу прощения и надеюсь, что вы выполнили свою домашнюю работу правильно, несмотря на мой троллинг, и такие ответы, как мои, не отговаривали вас от участия на сайте.

Ответ 4

#include <boost/range/algorithm/count.hpp>

std::string str = "a_b_c";
int cnt = boost::count(str, '_');

Ответ 5

Вы называете это... Lambda version...:)

using namespace boost::lambda;

std::string s = "a_b_c";
std::cout << std::count_if (s.begin(), s.end(), _1 == '_') << std::endl;

Вам нужно несколько включений... Я оставляю вас в качестве упражнения...

Ответ 6

Для поиска существует несколько методов std::string, но найти, вероятно, то, что вы ищете. Если вы имеете в виду строку C-стиля, то эквивалент - strchr. Тем не менее, в любом случае вы также можете использовать цикл for и проверять каждый символ - цикл - это то, что эти два завершают.

Как только вы узнаете, как найти следующего персонажа, заданного начальной позицией, вы постоянно продвигаете свой поиск (т.е. используете цикл), считая, когда идете.

Ответ 7

Вы можете узнать появление '_' в исходной строке с помощью строковых функций. Функция find() принимает 2 аргумента, первая строка, чьи вхождения мы хотим найти, а второй аргумент принимает начальную позицию. Если цикл используется для поиска вхождения до конца строки источника.

Пример:

string str2 = "_";
string strData = "bla_bla_blabla_bla_";

size_t pos = 0,pos2;

while ((pos = strData.find(str2, pos)) < strData.length()) 
{
    printf("\n%d", pos);
    pos += str2.length();
} 

Ответ 8

Подсчитать количество появлений символов в строке легко:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s="Sakib Hossain";
    int cou=count(s.begin(),s.end(),'a');
    cout<<cou;
}

Ответ 9

Использование лямбда-функции для проверки того, что символ равен "_", будет увеличиваться только счетчик, в противном случае это недопустимый символ

std::string s = "a_b_c"; size_t count = std::count_if( s.begin(), s.end(), []( char c ){if(c =='_') return true; }); std::cout << "The count of numbers: " << count << std::endl;

Ответ 10

Я бы сделал так:

#include <iostream>
#include <string>
using namespace std;
int main()
{

int count = 0;
string s("Hello_world");

for (int i = 0; i < s.size(); i++) 
    {
       if (s.at(i) == '_')    
           count++;
    }
cout << endl << count;
cin.ignore();
return 0;
}

Ответ 11

Я бы сделал что-то подобное :)

const char* str = "bla_bla_blabla_bla";
char* p = str;    
unsigned int count = 0;
while (*p != '\0')
    if (*p++ == '_')
        count++;

Ответ 12

Try

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


int WordOccurrenceCount( std::string const & str, std::string const & word )
{
       int count(0);
       std::string::size_type word_pos( 0 );
       while ( word_pos!=std::string::npos )
       {
               word_pos = str.find(word, word_pos );
               if ( word_pos != std::string::npos )
               {
                       ++count;

         // start next search after this word 
                       word_pos += word.length();
               }
       }

       return count;
}


int main()
{

   string sting1="theeee peeeearl is in theeee riveeeer";
   string word1="e";
   cout<<word1<<" occurs "<<WordOccurrenceCount(sting1,word1)<<" times in ["<<sting1 <<"] \n\n";

   return 0;
}

Ответ 13

public static void main(String[] args) {
        char[] array = "aabsbdcbdgratsbdbcfdgs".toCharArray();
        char[][] countArr = new char[array.length][2];
        int lastIndex = 0;
        for (char c : array) {
            int foundIndex = -1;
            for (int i = 0; i < lastIndex; i++) {
                if (countArr[i][0] == c) {
                    foundIndex = i;
                    break;
                }
            }
            if (foundIndex >= 0) {
                int a = countArr[foundIndex][1];
                countArr[foundIndex][1] = (char) ++a;
            } else {
                countArr[lastIndex][0] = c;
                countArr[lastIndex][1] = '1';
                lastIndex++;
            }
        }
        for (int i = 0; i < lastIndex; i++) {
            System.out.println(countArr[i][0] + " " + countArr[i][1]);
        }
    }