Comment puis-je compter le nombre de "_"
dans une chaîne comme "bla_bla_blabla_bla"
?
Comment puis-je compter le nombre de "_"
dans une chaîne comme "bla_bla_blabla_bla"
?
Réponses:
#include <algorithm>
std::string s = "a_b_c";
size_t n = std::count(s.begin(), s.end(), '_');
std::count
renvoie le type iterator_traits<InputIt>::difference_type
, ce qui n'est std::ptrdiff_t
pas le cas pour la plupart des conteneurs standard std::size_t
.
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 que c'est du code à utiliser avec std::string
, si vous utilisez char*
, remplacez s.size()
par strlen(s)
.
Notez également: je peux comprendre que vous souhaitiez quelque chose de "aussi petit que possible", mais je vous suggère d'utiliser cette solution à la place. Comme vous le voyez, vous pouvez utiliser une fonction pour encapsuler le code pour vous afin que vous n'ayez pas à écrire la for
boucle à chaque fois, mais que vous pouvez simplement l'utiliser count_underscores("my_string_")
dans le reste de votre code. L'utilisation d'algorithmes C ++ avancés est certainement possible ici, mais je pense que c'est exagéré.
Solution à l'ancienne avec des variables nommées de manière appropriée. Cela donne au code un peu d’esprit.
#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 suis justifié comme un coup sarcastique à une question à faible effort). C'est toxique et pas correct. Je ne supprime pas le message; J'ajoute ces excuses pour aider à changer l'atmosphère sur StackOverflow. Alors OP: je m'excuse et j'espère que vous avez bien fait vos devoirs malgré ma pêche à la traîne et que des réponses comme les miennes ne vous ont pas découragé de participer sur le site.
#include <boost/range/algorithm/count.hpp>
std::string str = "a_b_c";
int cnt = boost::count(str, '_');
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 cela comme un exercice ...
L'utilisation de la fonction lambda pour vérifier que le caractère est "_", puis seul le nombre sera incrémenté sinon un caractère non 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;
[]( char c ){if(c =='_') return true; }
invoque un comportement indéfini car vous n'avez pas renvoyé de valeur dans tous les chemins de code
Il existe plusieurs méthodes de recherche de std :: string, mais find est probablement ce que vous recherchez. Si vous voulez dire une chaîne de style C, alors l'équivalent est strchr. Cependant, dans les deux cas, vous pouvez également utiliser une boucle for et vérifier chaque caractère - la boucle est essentiellement ce que ces deux terminent.
Une fois que vous savez comment trouver le personnage suivant à partir d'une position de départ, vous avancez continuellement votre recherche (c'est-à-dire utilisez une boucle), en comptant au fur et à mesure.
Compter les occurrences de caractères dans une chaîne est simple:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s="Sakib Hossain";
int cou=count(s.begin(),s.end(),'a');
cout<<cou;
}
Vous pouvez trouver l'occurrence de '_' dans la chaîne source à l'aide des fonctions de chaîne. La fonction find () prend 2 arguments, la première chaîne dont nous voulons connaître les occurrences et le second argument prend la position de départ. Pendant que la boucle est utilisée pour trouver 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();
}
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;
}
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++;
Essayer
#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;
}
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]);
}
}