web-dev-qa-db-fra.com

Compter les occurrences de caractères dans une chaîne en C ++

Comment compter le nombre de "_" dans une chaîne comme "bla_bla_blabla_bla"?

179
andre de boer
#include <algorithm>

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

Pseudocode:

count = 0
For each character c in string s
  Check if c equals '_'
    If yes, increase count

EDIT: exemple de code C++:

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

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

  return count;
}

Notez qu'il s'agit d'un code à utiliser avec std::string, si vous utilisez char*, remplacez s.size() par strlen(s).

Notez également que je veux comprendre que vous souhaitiez quelque chose de "aussi petit que possible", mais je vous suggérerais plutôt d'utiliser cette solution. Comme vous le voyez, vous pouvez utiliser une fonction pour encapsuler le code afin que vous n'ayez pas à écrire la boucle for à chaque fois, mais que vous utilisiez simplement count_underscores("my_string_") dans le reste de votre code. L'utilisation d'algorithmes avancés en C++ est certainement possible ici, mais je pense que c'est exagéré.

28
schnaader

Solution à l'ancienne avec des variables nommées de manière appropriée. Cela donne un peu d’esprit au code.

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

Edit: environ 8 ans plus tard, en regardant cette réponse, j'ai honte de l'avoir fait (même si je me le justifiais comme un poke snarky à une question demandant peu d'effort). Ceci est toxique et pas OK. Je ne retire pas le post; J'ajoute ces excuses pour aider à changer l'atmosphère sur StackOverflow. Donc, OP: Je m'excuse et j'espère que vous avez bien fait vos devoirs malgré ma conduite à la traîne et que des réponses comme les miennes ne vous ont pas découragé de participer au site.

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

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

Vous l'appelez ... version Lambda ... :)

using namespace boost::lambda;

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

Vous avez besoin de plusieurs inclusions ... Je vous laisse comme exercice ...

7
Diego Sevilla

Il existe plusieurs méthodes de recherche std :: string, mais trouver est probablement ce que vous recherchez. Si vous voulez parler d'une chaîne de style C, l'équivalent est strchr. Cependant, dans les deux cas, vous pouvez également utiliser une boucle for et vérifier chaque caractère - la boucle correspond essentiellement à ce que ces deux résument.

Une fois que vous savez trouver le caractère suivant à partir d’une position de départ, vous continuez d’avancer votre recherche (c.-à-d. Utilisez une boucle), en comptant au fur et à mesure.

4
Roger Pate

Utilisation de la fonction lambda pour vérifier que le caractère est "_", alors seul le compte sera incrémenté, sinon le caractère n'est pas valide

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

Vous pouvez trouver l'occurrence de '_' dans la chaîne source en utilisant des fonctions de chaîne. La fonction find () prend 2 arguments, la première - chaîne dont nous voulons découvrir les occurrences et le second argument prend la position de départ. La boucle est utilisée pour rechercher l'occurrence jusqu'à la fin de la chaîne source.

exemple:

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

Compter les occurrences de caractères dans une chaîne est facile:

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

J'aurais fait comme ça:

#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

J'aurais fait quelque chose comme ça :)

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