2010-10-05 70 views
142

Tôi có thể đếm số lượng "_" bằng một chuỗi như "bla_bla_blabla_bla" bằng cách nào?Đếm số lần xuất hiện ký tự trong một chuỗi

+13

@jdmichal: "kém hỏi câu hỏi mới bắt đầu" = "bài tập về nhà" –

+0

@Roger : Tất nhiên có lẽ không có bài tập về nhà, nhưng tốt nhất là giả định bài tập về nhà ít nhất là vì câu trả lời, vì 1) làm hư hỏng câu hỏi về bài tập về nhà không tốt cho việc học, 2) bạn vẫn có thể học từ "câu trả lời bài tập" tốt, 3) OP có thể (và nên) trả phí dback và nói rằng đây không phải là bài tập về nhà – schnaader

+1

@schnaader: Điều gì xảy ra nếu OP nói đây không phải là bài tập về nhà của họ, có phải nó vẫn có khả năng là bài tập về nhà cho người khác? Chúng ta có nên "làm hỏng" nó cho họ không? Và ngược lại: một người mới tham gia C++ nhưng lâu ngoài trường có thể hỏi câu hỏi này; bạn sẽ cung cấp cho họ một câu trả lời "hoàn chỉnh"? Tại sao một đặc điểm của áp phích - được chỉ định bởi một giáo viên (bài tập về nhà) —về việc phân loại nội dung của câu hỏi (các thẻ)? Có vẻ như tất cả các câu trả lời bên dưới, bao gồm cả câu trả lời của bạn và của tôi, sẽ giống nhau bất kể thẻ đó. –

Trả lời

26

Mã giả:

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

EDIT: C++ mã ví dụ:

int count_underscores(string s) { 
    int count = 0; 

    for (int i = 0; i < s.size(); i++) 
    if (s[i] == '_') count++; 

    return count; 
} 

Lưu ý rằng đây là mã để sử dụng cùng với std::string, nếu bạn đang sử dụng char*, thay thế s.size() với strlen(s).

Cũng lưu ý: Tôi có thể hiểu bạn muốn một cái gì đó "càng nhỏ càng tốt", nhưng tôi khuyên bạn nên sử dụng giải pháp này thay thế. Như bạn thấy, bạn có thể sử dụng một hàm để đóng gói mã cho bạn, do đó bạn sẽ không phải viết ra vòng lặp for mọi lúc, nhưng chỉ có thể sử dụng count_underscores("my_string_") trong phần còn lại của mã của bạn. Sử dụng các thuật toán C++ nâng cao chắc chắn có thể ở đây, nhưng tôi nghĩ nó quá mức cần thiết.

+16

Chắc chắn chúng ta có thể đưa ra một phiên bản templated hoàn toàn không thể đọc được với các hàm lamba và một cuộc gọi bind2nd()? –

+0

@Martin Tôi đã thực sự nghĩ về điều đó. Thật không may, việc nắm bắt lập trình hàm C++ của tôi thực tế không tồn tại. – jdmichal

+6

Tôi nghĩ việc gọi một dịch vụ web sẽ thú vị hơn nhiều so với lambdas, sau đó thuật toán cốt lõi không chỉ là không thể hiểu được, nó được lưu trữ ở nơi khác. –

7

Bạn đặt tên cho nó ... Lambda phiên bản ... :)

using namespace boost::lambda; 

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

Bạn cần vài bao gồm ... Tôi để lại cho bạn đó là một tập thể dục ...

+7

Bạn có thực sự nghĩ rằng một newbie sẽ hiểu bất kỳ điều này? –

+1

@Josh: Có vẻ như đó là một phần nhỏ của tiếng cười trẻ con trong một số [comments] (http://stackoverflow.com/questions/3867890/count-character-occurrences-in-a-string/3867921#3867921). –

+4

Một số lập trình viên hàng đầu thế giới đã dành 15 năm cuối cùng để phát triển C++ đến mức chúng ta có thể viết điều này - nó không phải là trẻ con! –

16

Old-fashioned giải pháp với các biến được đặt tên thích hợp. Điều này mang lại cho mã một số tinh thần.

#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

tại sao không 'c + = '_' == * str;'? –

+0

Ngoài ra, không kiểm tra ký tự đầu tiên. Chuyển sang làm trong khi sửa lỗi. –

+0

Trong khi đó có thể làm việc trong thực tế, 'true' không bằng 1, nhưng một giá trị tùy ý không phải là 0 –

3

Có một số phương pháp std :: string để tìm kiếm, nhưng tìm kiếm có lẽ là những gì bạn đang tìm kiếm. Nếu bạn có nghĩa là một chuỗi kiểu C, thì tương đương là strchr. Tuy nhiên, trong cả hai trường hợp, bạn cũng có thể sử dụng vòng lặp for và kiểm tra từng ký tự — vòng lặp về cơ bản là những gì mà cả hai kết thúc.

Khi bạn biết cách tìm ký tự tiếp theo cho vị trí bắt đầu, bạn liên tục tiến hành tìm kiếm của mình (tức là sử dụng vòng lặp), tính khi bạn đi.

292
#include <algorithm> 

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

Đối số thứ ba là một loại char, nghĩa là, một dấu ngoặc đơn, chứ không phải trích dẫn kép ... –

-3

Hãy thử

#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

Bạn có thể tìm ra sự xuất hiện của '_' trong chuỗi nguồn bằng cách sử dụng chức năng chuỗi. hàm find() nhận 2 đối số, chuỗi đầu tiên có các lần xuất hiện mà chúng ta muốn tìm ra và đối số thứ hai bắt đầu từ vị trí bắt đầu. Vòng lặp được sử dụng để tìm ra sự xuất hiện cho đến cuối chuỗi nguồn.

dụ:

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

Các ans rất dễ dàng và tôi nghĩ rằng bạn nên làm theo như bạn tính toán trong não hoặc sách của bạn. Mã đã được đưa ra, Đó là lý do tại sao tôi không lặp lại nó.

tôi chỉ sắp xếp lại đang trên:

#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

tôi đã có thể làm theo cách này:

#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; 
    } 
Các vấn đề liên quan