Come posso contare il numero di "_"
in una stringa come "bla_bla_blabla_bla"
?
Come posso contare il numero di "_"
in una stringa come "bla_bla_blabla_bla"
?
Risposte:
#include <algorithm>
std::string s = "a_b_c";
size_t n = std::count(s.begin(), s.end(), '_');
std::count
restituisce il tipo iterator_traits<InputIt>::difference_type
, che per la maggior parte dei contenitori standard std::ptrdiff_t
non lo è std::size_t
.
pseudocodice:
count = 0
For each character c in string s
Check if c equals '_'
If yes, increase count
EDIT: codice di esempio C ++:
int count_underscores(string s) {
int count = 0;
for (int i = 0; i < s.size(); i++)
if (s[i] == '_') count++;
return count;
}
Si noti che questo è il codice da utilizzare insieme a std::string
, se lo si utilizza char*
, sostituire s.size()
con strlen(s)
.
Nota anche: posso capire che vuoi qualcosa "il più piccolo possibile", ma ti suggerisco di usare questa soluzione. Come vedi puoi usare una funzione per incapsulare il codice per te, così non dovrai scrivere il for
ciclo ogni volta, ma puoi semplicemente usarlo count_underscores("my_string_")
nel resto del codice. L'uso di algoritmi C ++ avanzati è certamente possibile qui, ma penso che sia eccessivo.
Soluzione vecchio stile con variabili con nome appropriato. Questo dà al codice un po 'di spirito.
#include <cstdio>
int _(char*__){int ___=0;while(*__)___='_'==*__++?___+1:___;return ___;}int main(){char*__="_la_blba_bla__bla___";printf("The string \"%s\" contains %d _ characters\n",__,_(__));}
Modifica: circa 8 anni dopo, guardando questa risposta mi vergogno di averlo fatto (anche se l'ho giustificato a me stesso come uno scherzo accanito a una domanda a basso sforzo). Questo è tossico e non va bene. Non rimuovo il post; Sto aggiungendo queste scuse per aiutare a spostare l'atmosfera su StackOverflow. Quindi OP: mi scuso e spero che tu abbia svolto bene i compiti nonostante la mia pesca a traina e che risposte come la mia non ti abbiano scoraggiato dal partecipare al sito.
#include <boost/range/algorithm/count.hpp>
std::string str = "a_b_c";
int cnt = boost::count(str, '_');
Lo chiami ... versione Lambda ... :)
using namespace boost::lambda;
std::string s = "a_b_c";
std::cout << std::count_if (s.begin(), s.end(), _1 == '_') << std::endl;
Hai bisogno di diversi include ... Ti lascio come esercizio ...
Utilizzando la funzione lambda per verificare che il carattere sia "_", verrà incrementato solo il conteggio altrimenti non sarà un carattere valido
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; }
invoca un comportamento indefinito perché non hai restituito un valore in tutti i percorsi del codice
Esistono diversi metodi di std :: string per la ricerca, ma find è probabilmente quello che stai cercando. Se intendi una stringa in stile C, l'equivalente è strchr. Tuttavia, in entrambi i casi, puoi anche usare un ciclo for e controllare ogni personaggio: il ciclo è essenzialmente ciò che questi due concludono.
Una volta che sai come trovare il personaggio successivo dato una posizione di partenza, fai avanzare continuamente la tua ricerca (cioè usa un ciclo), contando mentre procedi.
Contare le occorrenze di caratteri in una stringa è semplice:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s="Sakib Hossain";
int cou=count(s.begin(),s.end(),'a');
cout<<cou;
}
È possibile scoprire la presenza di '_' nella stringa di origine utilizzando le funzioni di stringa. La funzione find () accetta 2 argomenti, il primo - stringa di cui vogliamo scoprire le occorrenze e il secondo argomento prende la posizione iniziale. Mentre il ciclo viene usato per scoprire l'occorrenza fino alla fine della stringa di origine.
esempio:
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();
}
Avrei fatto così:
#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;
}
Avrei fatto qualcosa del genere :)
const char* str = "bla_bla_blabla_bla";
char* p = str;
unsigned int count = 0;
while (*p != '\0')
if (*p++ == '_')
count++;
Provare
#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]);
}
}