Como posso contar o número de "_"
em uma string como "bla_bla_blabla_bla"
?
Como posso contar o número de "_"
em uma string como "bla_bla_blabla_bla"
?
Respostas:
#include <algorithm>
std::string s = "a_b_c";
size_t n = std::count(s.begin(), s.end(), '_');
std::count
retorna o tipo iterator_traits<InputIt>::difference_type
, que para a maioria dos contêineres padrão std::ptrdiff_t
não é std::size_t
.
Pseudo-código:
count = 0
For each character c in string s
Check if c equals '_'
If yes, increase count
EDIT: código de exemplo C ++:
int count_underscores(string s) {
int count = 0;
for (int i = 0; i < s.size(); i++)
if (s[i] == '_') count++;
return count;
}
Observe que este é um código a ser usado junto std::string
, se você estiver usando char*
, substitua s.size()
por strlen(s)
.
Observe também: entendo que você deseja algo "o menor possível", mas sugiro que você use esta solução. Como você vê, você pode usar uma função para encapsular o código para você, para que não precise escrever o for
loop todas as vezes, mas pode usar apenas count_underscores("my_string_")
no restante do seu código. O uso de algoritmos avançados em C ++ é certamente possível aqui, mas acho que é um exagero.
Solução antiquada com variáveis nomeadas apropriadamente. Isso dá ao código algum espírito.
#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: cerca de 8 anos depois, olhando para esta resposta, eu tenho vergonha de ter feito isso (mesmo que eu tenha justificado isso para mim mesma como uma piada sarcástica em uma pergunta de baixo esforço). Isso é tóxico e não está bem. Não estou removendo a postagem; Estou adicionando esse pedido de desculpas para ajudar a mudar a atmosfera no StackOverflow. Então, OP: peço desculpas e espero que você tenha acertado sua lição de casa, apesar dos meus truques e que respostas como a minha não o desencorajaram a participar do site.
#include <boost/range/algorithm/count.hpp>
std::string str = "a_b_c";
int cnt = boost::count(str, '_');
Você escolhe ... Versão Lambda ... :)
using namespace boost::lambda;
std::string s = "a_b_c";
std::cout << std::count_if (s.begin(), s.end(), _1 == '_') << std::endl;
Você precisa de vários inclui ... Deixo isso como um exercício ...
Usando a função lambda para verificar se o caractere é "_", apenas a contagem será incrementada, caso contrário, não será um caractere válido
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; }
chama comportamento indefinido porque você não retornou um valor em todos os caminhos de código
Existem vários métodos de pesquisa para std :: string, mas encontrar é provavelmente o que você está procurando. Se você quer dizer uma string no estilo C, o equivalente é strchr. No entanto, em ambos os casos, você também pode usar um loop for e verificar cada caractere - o loop é essencialmente o que esses dois agrupam.
Depois de saber como encontrar o próximo caractere, dada uma posição inicial, você avança continuamente sua pesquisa (ou seja, usa um loop), contando à medida que avança.
Contar ocorrências de caracteres em uma sequência é fácil:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s="Sakib Hossain";
int cou=count(s.begin(),s.end(),'a');
cout<<cou;
}
Você pode descobrir a ocorrência de '_' na string de origem usando funções de string. A função find () recebe 2 argumentos, primeiro - string cujas ocorrências queremos descobrir e o segundo argumento toma posição inicial. Enquanto o loop é usado para descobrir a ocorrência até o final da string de origem.
exemplo:
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();
}
Eu teria feito assim:
#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;
}
Experimentar
#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]);
}
}