计算字符串中的字符出现次数

and*_*oer 187 c++ string pattern-matching

我如何计算"_"字符串中的数字"bla_bla_blabla_bla"

Ben*_*oit 386

#include <algorithm>

std::string s = "a_b_c";
size_t n = std::count(s.begin(), s.end(), '_');
Run Code Online (Sandbox Code Playgroud)

  • 第三个参数是char类型,即单引号,而不是双引号...... (12认同)
  • 这是最好的答案。 (2认同)

sch*_*der 28

伪代码:

count = 0
For each character c in string s
  Check if c equals '_'
    If yes, increase count
Run Code Online (Sandbox Code Playgroud)

编辑:C++示例代码:

int count_underscores(string s) {
  int count = 0;

  for (int i = 0; i < s.size(); i++)
    if (s[i] == '_') count++;

  return count;
}
Run Code Online (Sandbox Code Playgroud)

请注意,这是与std::string您一起使用的代码,如果您正在使用char*,请替换s.size()strlen(s).

还要注意:我能理解你想要"尽可能小"的东西,但我建议你改用这个解决方案.如您所见,您可以使用函数为您封装代码,这样您就不必for每次都写出循环,但只能count_underscores("my_string_")在代码的其余部分中使用.在这里使用高级C++算法肯定是可能的,但我认为这是过度的.

  • 当然,我们可以提出一个完全不可读的模板版本,其中包含lamba函数和bind2nd()调用? (20认同)
  • 我认为调用Web服务比lambdas更有趣,然后核心算法不仅是不可思议的,而是存储在其他地方. (8认同)

Tam*_*lei 19

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

#include <cstdio>
int _(char*__){int ___=0;while(*__)___='_'==*__++?___+1:___;return ___;}int main(){char*__="_la_blba_bla__bla___";printf("The string \"%s\" contains %d _ characters\n",__,_(__));}
Run Code Online (Sandbox Code Playgroud)

编辑:大约8年后,看着这个答案,我很惭愧,我做了这件事(尽管我把自己称为一个愚蠢的捅一个低调的问题).这是有毒的,不行.我没有删除帖子; 我正在添加这个道歉,以帮助改变StackOverflow上的氛围.所以OP:我道歉,我希望你尽管我的拖钓得到了正确的功课,像我这样的答案并没有阻止你参与网站.

  • 爱它.遗憾的是它违反了双下划线规则. (11认同)
  • @Tamas:int(true)在C++中始终为1. (4认同)
  • 一个真正老式的解决方案将声明sprintf的原型而不是#including a*整个头文件*! (4认同)
  • @Tamas:当然不是,但在"回答"初学者的问题时,我没有乐趣. (4认同)
  • 严重地?一个故意混淆的答案是你能做的最好的,你认为它在这里合适吗? (3认同)

小智 13

#include <boost/range/algorithm/count.hpp>

std::string str = "a_b_c";
int cnt = boost::count(str, '_');
Run Code Online (Sandbox Code Playgroud)


Nag*_*ppa 13

使用 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;
Run Code Online (Sandbox Code Playgroud)

  • 请添加解释 - 尽量不要单独发布简单的代码块。 (4认同)
  • 正如@phuclv建议的那样,还必须有 return false 语句 `size_t count = std::count_if( s.begin(), s.end(), []( char c ){if(c =='_') return true; 否则返回 false; });` (3认同)
  • 您不需要 if 语句 `size_t count = std::count_if( s.begin(), s.end(), []( char c ){ return c == '_'; });` (3认同)

Die*_*lla 9

你的名字...... Lambda版...... :)

using namespace boost::lambda;

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

你需要几个包括......我告诉你,这是一个练习......

  • 你真的觉得新手会理解这一点吗? (7认同)
  • 遗漏包含是荒谬的. (6认同)
  • 一些世界顶级程序员在过去的15年里一直在使用C++,我们可以写出这个 - 这不是幼稚的! (4认同)
  • 当 `std::count` 已经完成了所有需要的事情时,为什么还要这么复杂? (3认同)
  • @Josh:这似乎是某些 [评论](http://stackoverflow.com/questions/3867890/count-character-occurrences-in-a-string/3867921#3867921)中幼稚笑声的衍生。 (2认同)

Md.*_*ain 7

计算字符串中出现的字符很容易:

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

  • **推荐阅读:** [为什么我不应该#include &lt;bits/stdc++.h&gt;?](/sf/ask/2227126681/) (7认同)
  • -1 这与六年前现有的最佳答案相同——这意味着要添加什么?有一个区别:这个答案使用了错误的头文件。stdc++.h 特定于 GCC,即使使用该编译器,它也仅用于预编译头文件。 (4认同)