Подсчет вхождений символов в строке в C ++ - PullRequest
173 голосов
/ 06 октября 2010

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

Ответы [ 13 ]

373 голосов
/ 06 октября 2010
#include <algorithm>

std::string s = "a_b_c";
size_t n = std::count(s.begin(), s.end(), '_');
28 голосов
/ 06 октября 2010

псевдокод:

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

РЕДАКТИРОВАТЬ: C ++ пример кода:

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_") в остальной части кода. Использование передовых алгоритмов C ++ здесь, безусловно, возможно, но я думаю, что это излишне.

19 голосов
/ 06 октября 2010

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

#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.Итак, ОП: Я извиняюсь и надеюсь, что вы выполнили свою домашнюю работу правильно, несмотря на мой троллинг, и такие ответы, как мои, не отговаривали вас от участия на сайте.

12 голосов
/ 14 января 2013
#include <boost/range/algorithm/count.hpp>

std::string str = "a_b_c";
int cnt = boost::count(str, '_');
7 голосов
/ 06 октября 2010

Вы называете это ... Лямбда-версия ...:)

using namespace boost::lambda;

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

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

4 голосов
/ 06 октября 2010

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

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

2 голосов
/ 07 августа 2018

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

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;

2 голосов
/ 28 января 2016

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

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s="Sakib Hossain";
    int cou=count(s.begin(),s.end(),'a');
    cout<<cou;
}
2 голосов
/ 10 ноября 2014

Вы можете узнать вхождение '_' в исходной строке, используя строковые функции.Функция 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();
} 
1 голос
/ 22 августа 2017

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

#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;
}
...