C ++ में एक स्ट्रिंग में वर्ण आवृत्तियों की गणना करें


199

मैं "_"एक स्ट्रिंग की संख्या कैसे गिन सकता हूं "bla_bla_blabla_bla"?


17
@jdichal: "खराब तरीके से पूछे गए शुरुआती सवाल"! = "होमवर्क"

@ रेंजर: बेशक यह कोई होमवर्क नहीं है, लेकिन इसके होमवर्क को कम से कम उत्तरों के लिए मान लेना अच्छा है, क्योंकि 1) होमवर्क प्रश्न को खराब करना सीखने के लिए बुरा है, 2) आप अभी भी अच्छे "होमवर्क जवाब" से सीख सकते हैं: 3 ) ओपी (और कर सकता है) प्रतिक्रिया देना और कहना है कि यह कोई होमवर्क नहीं है
श्नाडर

3
@schnaader: क्या होगा यदि ओपी कहता है कि यह उनका होमवर्क नहीं है, क्या यह अभी भी किसी और के लिए होमवर्क होने की संभावना नहीं है? क्या हमें उनके लिए इसे बिगाड़ना चाहिए? और इसके विपरीत: सी ++ के लिए कोई नया लेकिन स्कूल से बाहर यह सवाल पूछ सकता है; क्या आप उन्हें "पूर्ण" उत्तर देंगे? पोस्टर की एक विशेषता क्यों होनी चाहिए - यह एक शिक्षक (गृहकार्य) द्वारा सौंपा गया है - प्रश्न की सामग्री (टैग) का एक वर्गीकरण? ऐसा लगता है कि नीचे दिए गए सभी उत्तर, आपके और मेरे दोनों सहित, उस टैग की परवाह किए बिना समान होंगे।

@Roger: अगर मुझे यकीन है कि यह होमवर्क नहीं है, तो मुझे एक और जवाब देना होगा। इस मामले में मैंने pseudocode के बजाय पूर्ण C कोड के साथ उत्तर दिया। और अन्य लोगों को बिगाड़ना इतना महत्वपूर्ण नहीं है - अगर वे इसे यहां खोज सकते हैं, तो वे Google को भी खोज सकते हैं। इसके अलावा, कुछ के लिए खोज वास्तव में बहुत बेहतर हो सकता है (हालांकि सबसे अच्छा नहीं) अपने होमवर्क को पोस्ट करने और कुछ मिनट बाद पूरा कोड / समाधान प्राप्त करने की तुलना में सीखना।
श्नाइडर

2
@schnaader: वहाँ 32 उत्तर हैं और क्रमबद्ध क्रम बदलता रहता है, कौन सा? क्या आपको लगता है कि मुझे इस "होमवर्क-एस्क" प्रश्न के लिए "पूर्ण कोड" उत्तर प्रदान नहीं करना चाहिए था ? पूरी तरह से ईमानदार होने के लिए, यहां सवाल के लिए, यह होमवर्क होने की परवाह किए बिना विचार को प्रोत्साहित करने के लिए मददगार है, और मुझे आपका उत्तर पसंद है, यदि यह पूरी तरह से सी कोड है, तो इस कारण से बेहतर है। आप प्रश्न का उत्तर देकर मददगार बन रहे हैं , पोस्टर

जवाबों:


418
#include <algorithm>

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

15
तीसरा तर्क एक चार प्रकार का है, यानी, एकल उद्धरण, दोहरे उद्धरण नहीं ...
इमर्सन जू

1
यह सबसे अच्छा जवाब है।
कोंचग

छोटे नोट, लेकिन रिटर्न प्रकार आमतौर पर हस्ताक्षरित है। किसी कारण के लिए std::countरिटर्न प्रकार iterator_traits<InputIt>::difference_type, जो अधिकांश मानक कंटेनरों के लिए है std::ptrdiff_t, नहीं std::size_t
डैनियल स्टीवंस

30

स्यूडोकोड:

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

संपादित करें: C ++ उदाहरण कोड:

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

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

  return count;
}

ध्यान दें कि यह एक साथ उपयोग करने के लिए कोड है std::string, यदि आप उपयोग कर रहे हैं, तो साथ char*बदलें ।s.size()strlen(s)

यह भी ध्यान दें: मैं समझ सकता हूं कि आप "जितना संभव हो उतना छोटा" चाहते हैं, लेकिन मैं आपको इसके बजाय इस समाधान का उपयोग करने का सुझाव दूंगा। जैसा कि आप देखते हैं कि आप अपने लिए कोड एनकैप्सुलेट करने के लिए एक फ़ंक्शन का उपयोग कर सकते हैं ताकि आपको forहर बार लूप लिखना न पड़े , लेकिन बस count_underscores("my_string_")अपने कोड के बाकी हिस्सों में उपयोग कर सकें । उन्नत C ++ एल्गोरिदम का उपयोग करना निश्चित रूप से यहां संभव है, लेकिन मुझे लगता है कि यह ओवरकिल है।


24
निश्चित रूप से हम लांबा फ़ंक्शंस और एक बाइंड 2nd () कॉल के साथ पूरी तरह से अपठनीय टेम्पलेटेड संस्करण के साथ आ सकते हैं?
मार्टिन बेकेट

@ मार्टिन मैं वास्तव में यही सोच रहा था। दुर्भाग्य से सी ++ कार्यात्मक प्रोग्रामिंग की मेरी समझ व्यावहारिक रूप से अस्तित्वहीन है।
जम्मिछाल

8
मुझे लगता है कि लैंबडास की तुलना में एक वेब सेवा को कॉल करना अधिक मजेदार होगा, फिर कोर एल्गोरिथ्म सिर्फ अयोग्य नहीं है, इसे कहीं और संग्रहीत किया जाता है।
बेन वोइगट

यह कोई होमवर्क सवाल नहीं है। मैं c ++ में नया हूं और उन्नत तरीके से इसे प्रोग्राम करने के लिए c ++ का पर्याप्त ज्ञान नहीं है। पढ़ें: जितना संभव हो उतना छोटा मैं इसे एक सरल तरीके से लूप और इतने पर के साथ प्रोग्राम करने में सक्षम हूं, लेकिन मैं एक परिष्कृत समाधान की तलाश में था, डिएगो के समाधान जैसा कुछ। अगली बार मैं प्रश्न के कारण के बारे में अधिक जानकारी दूंगा।
andre de boer

इसके अलावा, यदि आप डुप्लिकेट नहीं चाहते हैं तो आप आकस्मिक घटनाओं का उपभोग करना चाहते हैं। उदाहरण के लिए, वांछित वर्ण द्वारा स्ट्रिंग को विभाजित करने के बाद आपको कितने टुकड़े मिलेंगे, यह गिना जाएगा।
TheRealChx101

24

पुराने ढंग के हल उचित रूप से नामित चर के साथ। यह कोड को कुछ भाव देता है।

#include <cstdio>
int _(char*__){int ___=0;while(*__)___='_'==*__++?___+1:___;return ___;}int main(){char*__="_la_blba_bla__bla___";printf("The string \"%s\" contains %d _ characters\n",__,_(__));}

संपादित करें: लगभग 8 साल बाद, इस जवाब को देखकर मुझे शर्म आ रही है कि मैंने ऐसा किया (भले ही मैंने इसे कम प्रयास वाले सवाल के रूप में अपने आप को एक झूठा प्रहार के रूप में सही ठहराया)। यह विषाक्त है और ठीक नहीं है। मैं पद नहीं हटा रहा हूं; मैं StackOverflow पर वातावरण को बदलने में मदद करने के लिए इस माफी को जोड़ रहा हूं। इसलिए ओपी: मैं माफी मांगता हूं और मुझे आशा है कि मेरे ट्रोलिंग के बावजूद आपको अपना होमवर्क सही मिला और मेरे जैसे जवाबों ने आपको साइट पर भाग लेने से हतोत्साहित नहीं किया।


1
गंभीरता से? एक उद्देश्यपूर्ण रूप से obfuscated जवाब सबसे अच्छा आप कर सकते हैं और आपको लगता है कि यह कभी भी यहाँ उपयुक्त होगा?

4
@ तमस: int (सच) C ++ में हमेशा 1 होता है।

6
वास्तव में एक पुराने जमाने का समाधान एक पूरे हेडर फ़ाइल को #including करने के बजाय स्प्रिंट के लिए एक प्रोटोटाइप घोषित करेगा !
जॉन डिब्लिंग

5
@ टामस: बेशक नहीं, लेकिन मुझे "शुरुआती" सवालों के जवाब देते समय मेरा मज़ा नहीं है।

11
इसे प्यार करना। शर्म आती है यह डबल अंडरस्कोर नियम का उल्लंघन करता है।
मार्टिन यॉर्क

13
#include <boost/range/algorithm/count.hpp>

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

10

आप इसे नाम दें ... लैम्ब्डा संस्करण ... :)

using namespace boost::lambda;

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

आपको कई की आवश्यकता है ... मैं आपको एक अभ्यास के रूप में छोड़ देता हूं ...


7
क्या आपको वाकई लगता है कि कोई नौसिखिया इसमें से किसी को समझने वाला है?
जोश स्टोडोला

2
@ जोश: यह कुछ टिप्पणियों में बचकानी हँसी का स्पिनऑफ प्रतीत होता है ।

5
दुनिया के कुछ शीर्ष प्रोग्रामर्स ने अंतिम 15 साल का खर्च C ++ को उस बिंदु पर किया है, जहाँ हम इसे लिख सकते हैं - यह बचकाना नहीं है!
मार्टिन बेकेट

एक बिंदु बनाना कि जो लोग पर्ल को नहीं जानते हैं, वे इसे (बुरी तरह से) मजबूत करने के लिए मजबूर हैं - अब यह बचकाना होगा!
मार्टिन बेकेट

7
इसमें शामिलों को छोड़ना हास्यास्पद है।
पास्कलवूटन

5

चरित्र की जांच करने के लिए लंबो फ़ंक्शन का उपयोग करना "_" है, उसके बाद ही गणना की जाएगी अन्यथा एक मान्य वर्ण नहीं

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;

2
कृपया एक स्पष्टीकरण जोड़ें - कोशिश करें कि कोड के केवल सादे ब्लॉक पोस्ट न करें।
निश्चितप्ररूपता

1
आपको क्या लगता है, कि आपका उत्तर क्या प्रदान करता है, क्या एक पिछला उत्तर पहले से ही कवर नहीं किया गया है? कृपया अपना उत्तर संपादित करें और विस्तृत करें।
नरक

1
इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित, तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह दिखा कर इसके दीर्घकालिक मूल्य में बहुत सुधार होगा , और यह भविष्य के पाठकों को अन्य, समान प्रश्नों के साथ और अधिक उपयोगी बना देगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
टिम डाईकमैन

चरित्र की जांच करने के लिए लंबो फ़ंक्शन का उपयोग किया जाता है "_" तो केवल गणना की जाएगी अन्यथा एक वैध चरित्र नहीं।
नागप्पा

[]( char c ){if(c =='_') return true; }अपरिभाषित व्यवहार को आमंत्रित करता है क्योंकि आपने
phuclv

4

खोज के लिए std :: string की कई विधियाँ हैं, लेकिन संभवतः वह है जो आप खोज रहे हैं। यदि आपका मतलब सी-स्टाइल स्ट्रिंग है, तो समतुल्य स्ट्रैच है। हालाँकि, किसी भी मामले में, आप लूप के लिए भी उपयोग कर सकते हैं और प्रत्येक वर्ण की जांच कर सकते हैं - लूप अनिवार्य रूप से ये दोनों लपेटते हैं।

एक बार जब आप यह जान लेते हैं कि आरंभिक स्थिति में दिए गए अगले चरित्र को कैसे पाया जाए, तो आप अपनी खोज को लगातार आगे बढ़ाते हैं (जैसे कि लूप का उपयोग करें), आप जाते ही गिनती।


4

एक स्ट्रिंग में वर्ण वर्ण घटाना आसान है:

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

1
-1 यह छह साल पहले के मौजूदा शीर्ष उत्तर के समान है - इसे जोड़ने का क्या मतलब था? एक अंतर है: यह उत्तर गलत हेडर फ़ाइल का उपयोग करता है। stdc ++। H, GCC के लिए विशिष्ट है, और यहां तक ​​कि उस संकलक के साथ भी जो कि पहले से तैयार हेडर में उपयोग के लिए है।
आर्थर टक्का


2

आप स्ट्रिंग कार्यों का उपयोग करके स्रोत स्ट्रिंग में '_' की घटना का पता लगा सकते हैं। find () फ़ंक्शन 2 तर्क लेता है, पहला - स्ट्रिंग जिसकी घटनाएँ हम जानना चाहते हैं और दूसरा तर्क स्थिति शुरू करता है। स्रोत लूप के अंत तक घटना का पता लगाने के लिए लूप लूप का उपयोग किया जाता है।

उदाहरण:

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

2

मैंने इस तरह किया होगा:

#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;
}

हां, बिल्कुल, और वास्तव में मैंने ऐसा किया था, लेकिन यह कैसे बेकार हो गया जब मैंने इसे विजुअल स्टूडियो से एसओ के रूप में कॉपी किया।
शिवम झा

0

मैंने ऐसा कुछ किया होगा :)

const char* str = "bla_bla_blabla_bla";
char* p = str;    
unsigned int count = 0;
while (*p != '\0')
    if (*p++ == '_')
        count++;

-3

प्रयत्न

#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;
}

-4
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]);
        }
    }

1
ओह! गलत भाषा।
ऑर्बिट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.