计算C ++中字符串中的字符出现


199

我如何计算"_"像这样的字符串中的数量"bla_bla_blabla_bla"


17
@jdmichal:“初学者问题很少”!=“作业”

@Roger:当然也许不是家庭作业,但是至少要对答案做出假设是一件好事,因为1)破坏家庭作业对学习不利,2)您仍然可以从良好的“家庭作业答案”中学习,3 )操作人员可以(并且应该)提供反馈意见并说这不是功课
schnaader 2010年

3
@schnaader:如果OP表示这不是他们的家庭作业,那么它是否仍可能成为其他人的家庭作业呢?我们应该为他们“宠”吗?反之亦然:对C ++陌生但长时间不在学校的人可能会问这个问题。您会给他们一个“完整”的答案吗?为什么张贴者的特征(由老师(作业)分配)是问题内容(标签)的分类?似乎下面的所有答案,包括您和我的,都将是相同的,而与该标签无关。

@Roger:如果我确定这不是家庭作业,我确实会给出另一个答案。在这种情况下,我将使用完整的C代码而不是伪代码来回答。破坏他人并不是那么重要-如果他们可以在这里搜索,他们也可以搜索Google。此外,搜索内容实际上可能比仅仅发布作业并在几分钟后获得完整的代码/解决方案更好(尽管不是最好)的学习方式。
schnaader 2010年

2
@schnaader:那里有32个答案,排序顺序各不相同,哪一个?您是否认为我不应该为“家庭式”问题提供“完整代码”答案?坦率地说,对于这里的问题,鼓励思考而不管作业是有帮助的,因此,与具有完整的C代码的情况相比,我更喜欢您的回答。您可以通过回答问题来帮助自己而不是张贴者

Answers:


418
#include <algorithm>

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

15
第三个参数是char类型,即单引号,而不是双引号...
Emerson Xu

1
这是最好的答案。
Konchog

小注释,但是返回类型通常是带符号的。由于某种原因,对于大多数标准容器,std::count返回类型不是。iterator_traits<InputIt>::difference_typestd::ptrdiff_tstd::size_t
丹尼尔·史蒂文斯

30

伪代码:

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 ++算法,但是我认为这太过分了。


24
当然,我们可以提出一个完全不可读的模板版本,其中包含lamba函数和bind2nd()调用吗?
马丁·贝克特

@马丁我实际上是在想这个。不幸的是,我几乎不了解C ++函数编程。
jdmichal 2010年

8
我认为调用Web服务比Lambda有趣得多,然后核心算法不仅难以理解,而且存储在其他位置。
Ben Voigt 2010年

这不是作业问题。我是c ++的新手,并且没有足够的c ++知识以高级方式对此进行编程。阅读:尽可能小。我可以使用for循环等简单方式对此进行编程,但我一直在寻找复杂的解决方案,例如Diego的解决方案。下次,我将基于问题的原因提供更多信息。
安德烈·德布尔

另外,如果您不想重复,则希望消耗连续的事件。例如,计算将字符串除以所需字符后得到的数量。
TheRealChx101

24

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

#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年后,看着这个答案我很I愧我做到了(即使我为自己省下了一个省力的问题,也以此为理由)。这是有毒的,不好。我不会删除该职位;我要为此道歉,以帮助改变StackOverflow上的气氛。因此,OP:很抱歉,尽管您拖延了时间,但我希望您能做好功课,而像我这样的回答并不会阻止您参加该网站。


1
认真吗 一个有目的地混淆的答案是您可以做的最好的事情,您认为这里是否合适?

4
@Tamas:int(true)在C ++中始终为1。

6
一个真正老式的解决方案将为sprintf声明一个原型,而不是#include一个完整的头文件
John Dibling 2010年

5
@Tamas:当然不是,但是在“回答”初学者的问题时我没有乐趣。

11
爱它。可惜它违反了双重下划线规则。
马丁·约克

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

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

10

你叫它Lambda版本... :)

using namespace boost::lambda;

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

您需要几个附件...我留给您作为练习...


7
您是否真的认为新手会理解其中的任何内容?
乔什·斯托多拉

2
@Josh:在某些评论中,这似乎是幼稚笑声的衍生产物。

5
在过去的15年中,一些世界顶级程序员在C ++的发展上达到了我们可以编写此代码的地步-这并不幼稚!
马丁·贝克特

指出那些不了解Perl的人被迫(严重)重新发明它-现在那真是幼稚!
马丁·贝克特

7
忽略包含项是荒谬的。
PascalVKooten

5

使用lambda函数检查字符是否为“ _”,然后仅计数将递增,否则不是有效字符

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
请添加说明-尽量不要仅发布简单的代码块。
某些性能

1
您认为答案提供了什么,以前的答案尚未涵盖什么?请编辑并扩展您的答案。
hellow

1
感谢您提供此代码段,它可能会提供一些有限的即时帮助。一个适当的解释,将大大提高其长期的价值通过展示为什么这是一个很好的解决了这个问题,并会使其与其他类似的问题,更有助于未来的读者。请编辑您的答案以添加一些解释,包括您所做的假设。
蒂姆·迪克曼

使用lambda函数检查字符是否为“ _”,然后仅计数将递增,否则不是有效字符。
Nagappa

[]( char c ){if(c =='_') return true; }调用未定义的行为,因为您未在所有代码路径中都返回值
phuclv

4

std :: string有几种搜索方法,但find可能正是您要查找的内容。如果您指的是C风格的字符串,则等效为strchr。但是,无论哪种情况,您都可以使用for循环并检查每个字符-循环本质上是这两个循环所组成的循环。

一旦知道如何找到给定起始位置的下一个字符,就可以继续进行搜索(即使用循环),并不断进行搜索。


4

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

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

1
-1这与六年前的现有最高答案相同–这意味着要添加什么?有一个区别:这个答案使用了错误的头文件。stdc ++。h特定于GCC,即使使用该编译器,它也只能用于预编译的头文件中。
亚瑟塔卡


2

您可以使用字符串函数找出源字符串中“ _”的出现。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();
} 

2

我本可以这样做:

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

是的,当然,实际上我是这样做的,但是idk当我将其从Visual Studio复制到SO表单时,它是如何混乱的。
西瓦姆·贾

0

我会做这样的事情:)

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

-3

尝试

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

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

1
哎呀!语言错误。
Lightness Races in Orbit Race '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.