web-dev-qa-db-ja.com

文字列中の文字の出現回数を数える

"_"のような文字列で"bla_bla_blabla_bla"の数を数えるにはどうすればいいですか?

171
andre de boer
#include <algorithm>

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

疑似コード:

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++アルゴリズムを使用することは確かに可能ですが、やり過ぎだと思います。

28
schnaader

適切に名前が付けられた変数を使った昔ながらの解決法。これはコードにいくらかの精神を与えます。

#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年後、この答えを見て、私はこれをしたことを恥ずかしく思います(たとえ私がそれを自分自身に低努力の質問で卑劣な詩として正当化したとしても)。これは有毒であり、そしてOKではありません。私は投稿を削除していません。私はStackOverflowの雰囲気を変えるのを助けるためにこの謝罪を加えています。だからOP:私はお詫び申し上げます、私のトローリングにもかかわらずあなたがあなたの宿題を正しく得たこと、そして私のような答えがあなたがサイトに参加するのを妨げないことを願っています。

20
Tamás Szelei
#include <boost/range/algorithm/count.hpp>

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

あなたはそれに名前を付けます... Lambda version ... :)

using namespace boost::lambda;

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

あなたはいくつかのインクルードが必要です。

8
Diego Sevilla

検索にはいくつかstd :: stringのメソッドがありますが、findはおそらくあなたが探しているものです。あなたがCスタイルの文字列を意味しているなら、それと同等のものはstrchrです。ただし、どちらの場合も、forループを使用して各文字をチェックすることができます。ループは本質的にこれら2つをまとめたものです。

開始位置を指定して次の文字を見つける方法がわかったら、進むにつれてカウントを続けながら検索を進めます(つまり、ループを使用します)。

4
Roger Pate

文字列内の文字の出現回数を数えるのは簡単です。

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

ラムダ関数を使用して文字をチェックすると "_"になり、countだけがインクリメントされます。それ以外の場合は有効な文字ではありません。

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
Nagappa

文字列関数を使用して、ソース文字列内の '_'の出現を見つけることができます。 find()関数は2つの引数を取ります。最初の文字列は出現を見つけたい文字列、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();
} 
2
Amruta Ghodke

私はこのようにしていたでしょう:

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

私はそのようなことをしただろう:)

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