2010-10-05 21 views
142

¿Cómo puedo contar el número de "_" en una cadena como "bla_bla_blabla_bla"?Cuente las ocurrencias de caracteres en una cadena

+13

@jdmichal: "mal pedido principiante pregunta" = "tarea" –

+0

@Roger : Por supuesto, tal vez no sea tarea, pero es bueno asumir su tarea al menos para las respuestas, porque 1) echar a perder una tarea es malo para el aprendizaje, 2) todavía se puede aprender de las buenas "respuestas a la tarea", 3) la OP puede (y debería) dar honorarios dback y decir que esto no es tarea – schnaader

+1

@schnaader: ¿Qué pasa si el OP dice que esta no es su tarea, no es probable que sea tarea para otra persona? ¿Deberíamos "estropearlo" por ellos? Y viceversa: alguien nuevo en C++ pero que ha estado fuera de la escuela hace la siguiente pregunta; ¿les darías una respuesta "completa"? ¿Por qué una característica del póster -ser asignada por un profesor (deberes-) es una categorización del contenido (etiquetas) de la pregunta? Parece que todas las respuestas a continuación, incluidas la tuya y la mía, habrían sido las mismas independientemente de esa etiqueta. –

Respuesta

26

Pseudocódigo:

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

EDIT: C++ código de ejemplo:

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 el código para utilizar junto con std::string, si está usando char*, reemplace s.size() con strlen(s).

También tenga en cuenta: Puedo entender que desea algo "lo más pequeño posible", pero le sugiero que use esta solución. Como puede ver, puede usar una función para encapsular el código para que no tenga que escribir el bucle for cada vez, pero puede simplemente usar count_underscores("my_string_") en el resto de su código. Usar algoritmos avanzados de C++ es ciertamente posible aquí, pero creo que es exagerado.

+16

Seguramente podemos encontrar una versión de plantilla totalmente ilegible con funciones lamba y una llamada bind2nd()? –

+0

@Martin en realidad estaba pensando en eso. Desafortunadamente, mi comprensión de la programación funcional C++ es prácticamente inexistente. – jdmichal

+6

Creo que llamar a un servicio web sería mucho más divertido que lambdas, entonces el algoritmo central no es solo inescrutable, sino que está almacenado en otra parte. –

7

Lo que sea ... Lambda versión ... :)

using namespace boost::lambda; 

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

necesita varias incluye ... os dejo como ejercicio ...

+7

¿De verdad crees que un novato va a entender algo de esto? –

+1

@Josh: Parece ser un derivado de la risa infantil en algunos [comentarios] (http://stackoverflow.com/questions/3867890/count-character-occurrences-in-a-string/3867921#3867921). –

+4

Algunos de los mejores programadores del mundo han pasado los últimos 15 años evolucionando C++ hasta el punto en que podemos escribir esto, ¡no es infantil! –

16

solución pasado de moda con apropiadamente nombrado variables. 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",__,_(__));} 
+0

¿por qué no 'c + = '_' == * str;'? –

+0

Además, no prueba el primer carácter. Cambia a do-while para arreglarlo. –

+0

Si bien eso podría funcionar en la práctica, 'verdadero' no es igual a 1, sino un valor arbitrario que no es 0. –

3

Existen varios métodos de std :: string para buscar, pero probablemente encuentres lo que estás buscando. Si te refieres a una cadena 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 cierran.

Una vez que sepa cómo encontrar el siguiente carácter dado una posición de inicio, avanzará continuamente su búsqueda (es decir, utilizará un bucle), contando a medida que avanza.

292
#include <algorithm> 

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

El tercer argumento es un tipo de caracteres, es decir, comillas simples, no comillas dobles ... –

-3

Trate

#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; 
} 
8
#include <boost/range/algorithm/count.hpp> 

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

puede averiguar ocurrencia de '_' en la cadena de origen mediante el uso de funciones de cadena. La función find() toma 2 argumentos, primera cadena cuyas ocurrencias queremos averiguar y segundo argumento toma posición de inicio. El bucle constante se usa para averiguar la ocurrencia hasta el final de la cadena fuente.

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(); 
} 
3

El ans es fácil y creo que debe seguir como se calcula en el cerebro o un libro. El código ya está dado, es por eso que no lo repito.

simplemente reacomodé de código superior:

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

lo habría 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++) //can't be i <= s.size() because s.at(s.size()) will result in overflow 
     { if (s.at(i) == '_') count++; 
} 
    cout << endl << count; 
    cin.ignore(); 
    return 0; 
    } 
Cuestiones relacionadas