Ответ 1
#include <algorithm>
std::string s = "a_b_c";
size_t n = std::count(s.begin(), s.end(), '_');
Как я могу подсчитать количество "_"
в строке типа "bla_bla_blabla_bla"
?
#include <algorithm>
std::string s = "a_b_c";
size_t n = std::count(s.begin(), s.end(), '_');
псевдокод:
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_")
в остальной части вашего кода. Использование продвинутых алгоритмов на С++, конечно, возможно здесь, но я думаю, что это чрезмерно.
Старомодное решение с правильно названными переменными. Это дает коду некоторый дух.
#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. Итак, ОП: Я прошу прощения и надеюсь, что вы выполнили свою домашнюю работу правильно, несмотря на мой троллинг, и такие ответы, как мои, не отговаривали вас от участия на сайте.
#include <boost/range/algorithm/count.hpp>
std::string str = "a_b_c";
int cnt = boost::count(str, '_');
Вы называете это... Lambda version...:)
using namespace boost::lambda;
std::string s = "a_b_c";
std::cout << std::count_if (s.begin(), s.end(), _1 == '_') << std::endl;
Вам нужно несколько включений... Я оставляю вас в качестве упражнения...
Для поиска существует несколько методов std::string, но найти, вероятно, то, что вы ищете. Если вы имеете в виду строку C-стиля, то эквивалент - strchr. Тем не менее, в любом случае вы также можете использовать цикл for и проверять каждый символ - цикл - это то, что эти два завершают.
Как только вы узнаете, как найти следующего персонажа, заданного начальной позицией, вы постоянно продвигаете свой поиск (т.е. используете цикл), считая, когда идете.
Вы можете узнать появление '_' в исходной строке с помощью строковых функций. Функция 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();
}
Подсчитать количество появлений символов в строке легко:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s="Sakib Hossain";
int cou=count(s.begin(),s.end(),'a');
cout<<cou;
}
Использование лямбда-функции для проверки того, что символ равен "_", будет увеличиваться только счетчик, в противном случае это недопустимый символ
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;
Я бы сделал так:
#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;
}
Я бы сделал что-то подобное :)
const char* str = "bla_bla_blabla_bla";
char* p = str;
unsigned int count = 0;
while (*p != '\0')
if (*p++ == '_')
count++;
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;
}
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]);
}
}