在c++中计算字符串中字符的出现次数

我怎样才能计算"_"在像"bla_bla_blabla_bla"这样的字符串中的数量?

418831 次浏览

伪代码:

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*,用strlen(s)替换s.size()

另外注意:我可以理解你想要“尽可能小”的东西,但我建议你使用这个解决方案。正如你所看到的,你可以使用一个函数来封装代码,这样你就不必每次都写出for循环,但可以在其余的代码中使用count_underscores("my_string_")。在这里,使用高级c++算法当然是可行的,但我认为这太过了。

你能想到的……Lambda版本……:)

using namespace boost::lambda;


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

你需要几个include…我把这个留给你们做练习。

具有适当命名变量的老式解决方案。这给了代码一些精神。

#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上的气氛。所以OP:我道歉,我希望你的作业是正确的,尽管我的喷子,像我这样的答案并没有阻止你参与网站。

std::string有几个用于搜索的方法,但find可能是你要找的。如果您指的是c风格的字符串,那么等效的是strchr。然而,在这两种情况下,您也可以使用for循环并检查每个字符—循环本质上是这两个字符的结义。

一旦你知道如何找到给定起始位置的下一个字符,你就可以不断地推进搜索(即使用循环),一边计算一边计算。

#include <algorithm>


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

试一试

#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;
}
#include <boost/range/algorithm/count.hpp>


std::string str = "a_b_c";
int cnt = boost::count(str, '_');
你可以使用字符串函数找出源字符串中'_'的出现情况。 Find()函数有两个参数,第一个参数是我们想要找出其出现的字符串,第二个参数是起始位置。While循环用于查找源字符串结束之前的出现情况

例子:

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;
}
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]);
}
}

我会这样做:

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

使用lambda函数检查字符是"_"然后唯一的计数将被增加,否则不是一个有效字符

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

我也会这么做:)

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

基于范围的for循环很方便

int countUnderScores(string str)
{
int count = 0;


for (char c: str)
if (c == '_') count++;
   

return count;
}
int main()
{
string str = "bla_bla_blabla_bla";
int count = countUnderScores(str);
cout << count << endl;
}