¿Cómo puedo contar el número de "_"
en una cadena como "bla_bla_blabla_bla"
?
¿Cómo puedo contar el número de "_"
en una cadena como "bla_bla_blabla_bla"
?
Respuestas:
#include <algorithm>
std::string s = "a_b_c";
size_t n = std::count(s.begin(), s.end(), '_');
std::count
devuelve el tipo iterator_traits<InputIt>::difference_type
, que para la mayoría de los contenedores estándar std::ptrdiff_t
no lo es std::size_t
.
Pseudocódigo:
count = 0
For each character c in string s
Check if c equals '_'
If yes, increase count
EDITAR: código de ejemplo de C ++:
int count_underscores(string s) {
int count = 0;
for (int i = 0; i < s.size(); i++)
if (s[i] == '_') count++;
return count;
}
Tenga en cuenta que este es un código para usar junto con std::string
, si lo está usando char*
, reemplace s.size()
con strlen(s)
.
También tenga en cuenta: puedo entender que quiere algo "lo más pequeño posible", pero le sugiero que utilice esta solución. Como puede ver, puede usar una función para encapsular el código por usted para que no tenga que escribir el for
bucle cada vez, sino que puede usarlo count_underscores("my_string_")
en el resto de su código. El uso de algoritmos avanzados de C ++ es ciertamente posible aquí, pero creo que es excesivo.
Solución pasada de moda con variables apropiadamente nombradas. Esto le da al código algo de espíritu.
#include <cstdio>
int _(char*__){int ___=0;while(*__)___='_'==*__++?___+1:___;return ___;}int main(){char*__="_la_blba_bla__bla___";printf("The string \"%s\" contains %d _ characters\n",__,_(__));}
Editar: unos 8 años después, al ver esta respuesta, me da vergüenza haberlo hecho (aunque lo justifiqué para mí mismo como un golpe sarcástico en una pregunta de bajo esfuerzo). Esto es tóxico y no está bien. No estoy quitando la publicación; Estoy agregando esta disculpa para ayudar a cambiar la atmósfera en StackOverflow. OP: Pido disculpas y espero que hayas hecho bien tu tarea a pesar de mi curricán y que las respuestas como la mía no te desanimaron a participar en el sitio.
#include <boost/range/algorithm/count.hpp>
std::string str = "a_b_c";
int cnt = boost::count(str, '_');
Lo que sea ... versión Lambda ... :)
using namespace boost::lambda;
std::string s = "a_b_c";
std::cout << std::count_if (s.begin(), s.end(), _1 == '_') << std::endl;
Necesitas varios incluye ... Te dejo como ejercicio ...
El uso de la función lambda para verificar que el carácter es "_", entonces solo se incrementará el conteo; de lo contrario, no será un carácter 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; }
invoca un comportamiento indefinido porque no devolvió un valor en todas las rutas de código
Hay varios métodos de std :: string para buscar, pero encontrar es probablemente lo que está buscando. Si te refieres a una cadena de estilo C, entonces el equivalente es strchr. Sin embargo, en cualquier caso, también puede usar un bucle for y verificar cada carácter: el bucle es esencialmente lo que estos dos envuelven.
Una vez que sabe cómo encontrar el siguiente personaje dado una posición inicial, avanza continuamente su búsqueda (es decir, utiliza un bucle), contando a medida que avanza.
Contar las ocurrencias de caracteres en una cadena es 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;
}
Puede encontrar la aparición de '_' en la cadena fuente utilizando las funciones de cadena. La función find () toma 2 argumentos, la primera cadena cuyas apariciones queremos averiguar y el segundo argumento toma la posición de inicio.
ejemplo:
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();
}
Lo hubiera hecho de esta manera:
#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;
}
Hubiera hecho algo así :)
const char* str = "bla_bla_blabla_bla";
char* p = str;
unsigned int count = 0;
while (*p != '\0')
if (*p++ == '_')
count++;
Tratar
#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]);
}
}