Як я можу порахувати кількість "_"
рядків типу "bla_bla_blabla_bla"
?
Як я можу порахувати кількість "_"
рядків типу "bla_bla_blabla_bla"
?
Відповіді:
#include <algorithm>
std::string s = "a_b_c";
size_t n = std::count(s.begin(), s.end(), '_');
std::count
тип повернення iterator_traits<InputIt>::difference_type
, який для більшості стандартних контейнерів є std::ptrdiff_t
, ні std::size_t
.
Псевдокод:
count = 0
For each character c in string s
Check if c equals '_'
If yes, increase count
EDIT: Приклад 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 ++ тут, безумовно, можливо, але я думаю, що це надмірно.
Старомодне рішення з відповідними назвами змінних. Це надає коду деякий дух.
#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, '_');
Ви називаєте це ... версія лямбда ...
using namespace boost::lambda;
std::string s = "a_b_c";
std::cout << std::count_if (s.begin(), s.end(), _1 == '_') << std::endl;
Вам потрібно кілька включень ... Я залишаю це як вправу ...
Використовуючи лямбда-функцію для перевірки символу "_", тоді буде нарощено лише кількість, а не недійсний символ
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;
[]( char c ){if(c =='_') return true; }
посилається на невизначену поведінку, оскільки ви не повернули значення у всіх кодових шляхах
Існує кілька методів std :: string для пошуку, але знайти, мабуть, те, що ви шукаєте. Якщо ви маєте на увазі рядок у стилі C, то еквівалент strchr. Однак у будь-якому випадку ви також можете скористатися циклом для перевірки кожного символу - цикл - це по суті те, що ці два загортають.
Як тільки ви знаєте, як знайти наступного символу, який задається початковою позицією, ви постійно просуваєте пошук (тобто використовуєте цикл), рахуючи під час проходження.
Підрахувати події символів у рядку легко:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s="Sakib Hossain";
int cou=count(s.begin(),s.end(),'a');
cout<<cou;
}
Ви можете дізнатись появу '_' у вихідному рядку, скориставшись функціями string. 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 <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++;
Спробуйте
#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]);
}
}