সি ++ তে একটি স্ট্রিংয়ে অক্ষরের উপস্থিতি গণনা করুন


199

আমি কীভাবে "_"একটি স্ট্রিংয়ের মধ্যে সংখ্যাটি গণনা করতে পারি "bla_bla_blabla_bla"?


17
@ জেডিমিকাল: "খারাপ প্রশ্ন জিজ্ঞাসা করা শিগগির প্রশ্ন"! = "হোমওয়ার্ক"

@ রোজার: অবশ্যই এটি কোনও হোম ওয়ার্ক নয়, তবে কমপক্ষে উত্তরের জন্য এর হোমওয়ার্কটি ধরে নেওয়া ভাল, কারণ 1) একটি হোম ওয়ার্কের প্রশ্ন নষ্ট করা শেখার পক্ষে খারাপ, 2) আপনি এখনও "হোমওয়ার্কের উত্তরগুলি" থেকে শিখতে পারেন, 3 ) ওপি প্রতিক্রিয়া জানাতে পারে (এবং উচিত) এটি কোনও হোম
ওয়ার্ক নয়

3
@ শকনাডার: ওপি যদি বলে যে এটি তাদের গৃহকর্ম নয়, তবে এখনও অন্য কারও জন্য গৃহকর্ম হওয়ার সম্ভাবনা নেই? আমাদের কি তাদের "লুণ্ঠন" করা উচিত? এবং তদ্বিপরীত: সি ++ তে নতুন কেউ কিন্তু বিদ্যালয়ের বাইরে খুব সহজেই এই প্রশ্নটি জিজ্ঞাসা করতে পারে; আপনি তাদের একটি "সম্পূর্ণ" উত্তর দিতে হবে? পোস্টারের একটি বৈশিষ্ট্য-কেন এটি কোনও শিক্ষকের (হোমওয়ার্ক) দ্বারা নির্ধারিত হওয়া উচিত - প্রশ্নের সামগ্রীর (ট্যাগ) শ্রেণিবিন্যাসের মাধ্যমে? আপনার ট্যাগটি নির্বিশেষে আপনার এবং আমার উভয় সহ নীচের সমস্ত উত্তর একইরকম হত।

@ রোজার: আমি যদি নিশ্চিত হয়ে থাকি যে এটি হোমওয়ার্ক নয় তবে আমি আরও একটি উত্তর দিয়েছি। এই ক্ষেত্রে আমি সিউডোকোডের পরিবর্তে সম্পূর্ণ সি কোড দিয়ে উত্তর দিয়েছি। এবং অন্যান্য লোকদের ক্ষতিগ্রস্থ করা তাত্পর্যপূর্ণ নয় - তারা যদি এখানে এটি সন্ধান করতে পারে তবে তারা গুগলও অনুসন্ধান করতে পারে। এছাড়াও, আপনার হোম ওয়ার্ক পোস্ট করা এবং কয়েক মিনিট পরে সম্পূর্ণ কোড / সমাধান পাওয়ার চেয়ে কোনও কিছুর সন্ধান করা আসলে শেখার উপায় হতে পারে আরও ভাল (যদিও সেরা নয়) way
schnaader

2
@ শকনাডার: এখানে ৩২ টি উত্তর রয়েছে এবং সাজানোর ক্রমের পরিবর্তিত হয় কোনটি? আপনি কি মনে করেন এই "হোম ওয়ার্ক-এস্কে" প্রশ্নের জন্য আমার একটি "সম্পূর্ণ কোড" উত্তর দেওয়া উচিত ছিল না ? পুরোপুরি সত্যি বলতে, এখানে প্রশ্নের জন্য, এটি বাড়ির কাজ নির্বিশেষে চিন্তাকে উত্সাহিত করতে সহায়ক, এবং আপনার উত্তরটি পুরো সি কোড থাকলে তার চেয়ে অনেক বেশি ভাল বলে মনে করি। পোস্টারের বহিরাগত উদ্দেশ্য নয় , আপনি প্রশ্নের জবাব দিয়ে আপনি সহায়ক হচ্ছেন

উত্তর:


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

সম্পাদনা: সি ++ উদাহরণ কোড:

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)

এছাড়াও নোট করুন: আমি বুঝতে পারি যে আপনি "যতটা সম্ভব ছোট" কিছু চান, তবে আমি আপনাকে এই সমাধানটি পরিবর্তে ব্যবহার করার পরামর্শ দিই। আপনি দেখতে পাচ্ছেন যে কোডটি আপনার জন্য encapsulate করতে আপনি একটি ফাংশন ব্যবহার করতে পারেন যাতে আপনাকে forপ্রতিবার লুপটি লিখতে হবে না , তবে কেবল count_underscores("my_string_")আপনার বাকী কোডটি ব্যবহার করতে পারে । উন্নত সি ++ অ্যালগরিদম ব্যবহার এখানে অবশ্যই সম্ভব, তবে আমি মনে করি এটি ওভারকিল।


24
অবশ্যই আমরা লাম্বা ফাংশন এবং একটি বাইন্ড 2 () কল সহ একটি সম্পূর্ণ অপঠনযোগ্য টেম্প্লেটেড সংস্করণ নিয়ে আসতে পারি?
মার্টিন বেকেট 21

@ মার্টিন আমি আসলে এটির কথা ভাবছিলাম। দুর্ভাগ্যক্রমে আমার সি ++ ফাংশনাল প্রোগ্রামিংয়ের উপলব্ধি কার্যত অস্তিত্বহীন।
jdmichal

8
আমি মনে করি ল্যাম্বডাসের চেয়ে কোনও ওয়েব পরিষেবা কল করা আরও মজাদার হবে, তবে মূল অ্যালগরিদম কেবল অনির্বচনীয় নয়, এটি অন্য কোথাও সঞ্চিত রয়েছে।
বেন ভয়েগট

এটি কোনও হোমওয়ার্কের প্রশ্ন নয়। আমি সি ++ এ নতুন এবং এটিকে উন্নত পদ্ধতিতে প্রোগ্রাম করার জন্য সি ++ সম্পর্কে পর্যাপ্ত জ্ঞান নেই। পড়ুন: যতটা সম্ভব ছোট আমি এটিকে একটি লুপ এবং আরও অনেকগুলি দিয়ে একটি সাধারণ পদ্ধতিতে প্রোগ্রাম করতে সক্ষম হয়েছি, তবে আমি একটি পরিশীলিত সমাধান খুঁজছিলাম, ডিয়েগোর সমাধানের মতো কিছু। পরের বার প্রশ্নের কারণের জন্য আরও তথ্য দেব।
আন্দ্রে ডি বোয়ার

এছাড়াও, আপনি নকলগুলি না চাইলে আপনি সামঞ্জস্যপূর্ণ ঘটনাগুলি গ্রাস করতে চান। উদাহরণস্বরূপ, পছন্দসই অক্ষর দ্বারা স্ট্রিং বিভক্ত করার পরে আপনি কত টুকরো পাবেন তা গণনা করা।
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 বছর পরে, এই উত্তরটির দিকে তাকিয়ে আমি লজ্জা পেয়েছি আমি এটি করেছিলাম (যদিও আমি স্বল্প-প্রচেষ্টা সংক্রান্ত প্রশ্নের কাছে নিজেকে স্পর্শকাতর পোকার হিসাবে ন্যায্যতা দিয়েছি)। এটি বিষাক্ত এবং ঠিক নেই। আমি পোস্টটি সরাচ্ছি না; স্ট্যাকওভারফ্লোতে বায়ুমণ্ডল পরিবর্তন করতে আমি এই ক্ষমা প্রার্থনা করছি। সুতরাং ওপি: আমি ক্ষমাপ্রার্থী এবং আমি আশা করি আমার ট্রোলিং সত্ত্বেও আপনি ঠিক আপনার বাড়ির কাজটি পেয়েছেন এবং আমার মতো উত্তরগুলি আপনাকে সাইটে অংশ নেওয়া থেকে নিরুৎসাহিত করে না।


1
সিরিয়াসলি? উদ্দেশ্যমূলকভাবে অপ্রচলিত উত্তরটি আপনি সবচেয়ে ভাল করতে পারেন এবং আপনি কি মনে করেন যে এটি এখানে কখনও উপযুক্ত হবে?

4
@ তমাস: ইন (সত্য) সি ++ তে সর্বদা 1।

6
একটি সত্যিকারের পুরানো ধাঁচের সমাধানটি একটি সম্পূর্ণ হেডার ফাইল অন্তর্ভুক্ত করার পরিবর্তে স্প্রিন্টফের জন্য একটি প্রোটোটাইপ ঘোষণা করবে !
জন ডিবলিং

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
আপনি কি সত্যিই ভাবেন যে কোনও নবাগত এই কিছু বুঝতে পারে?
জোশ স্টোডোলা 21

2
@ জোশ: এটি কিছু মন্তব্যে শিশুসুলভ হাসির একটি স্পিন অফ বলে মনে হচ্ছে ।

5
বিশ্বের শীর্ষস্থানীয় প্রোগ্রামারদের মধ্যে কেউ গত 15 বছরের বিকাশ সি ++ এ ব্যয় করেছেন যেখানে আমরা এটি লিখতে পারি - এটি শিশুসুলভ নয়!
মার্টিন বেকেট

এমন একটি বিষয় তৈরি করা যাঁরা পার্লকে চেনেন না তারা পুনরায় এটি পুনরায় উদ্ভাবন করতে বাধ্য হন (খারাপভাবে) - এখন তা শিশুসুলভ হবে!
মার্টিন বেকেট

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
আপনি কী মনে করেন, যে আপনার উত্তরটি সরবরাহ করে, পূর্ববর্তী উত্তরটি ইতিমধ্যে coveredাকেনি? আপনার উত্তরটি সম্পাদনা করুন এবং প্রসারিত করুন।
হেলো

1
এই কোড স্নিপেটের জন্য আপনাকে ধন্যবাদ, যা কিছু সীমিত, তাত্ক্ষণিক সহায়তা সরবরাহ করতে পারে। একটি সঠিক ব্যাখ্যা কেন এটি সমস্যার একটি ভাল সমাধান, তা দেখিয়ে তার দীর্ঘমেয়াদী মানকে ব্যাপকভাবে উন্নত করবে এবং ভবিষ্যতে পাঠকদের আরও অন্যান্য অনুরূপ প্রশ্নের সাথে আরও দরকারী করে তুলবে। আপনার অনুমানগুলি সহ কিছু ব্যাখ্যা যুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন।
টিম ডেকম্যান

অক্ষরটি পরীক্ষা করতে ল্যাম্বদা ফাংশনটি ব্যবহৃত হয় "_" তবে কেবল গণনাটি বাড়ানো হবে অন্যথায় বৈধ অক্ষর নয়।
নাগাপ্পা

4

অনুসন্ধানের জন্য std :: স্ট্রিংয়ের বেশ কয়েকটি পদ্ধতি রয়েছে তবে সম্ভবত আপনি যা খুঁজছেন তা সন্ধান করুন। আপনি যদি কোনও সি-স্টাইলের স্ট্রিং বোঝাতে চান তবে তার সমতুল্য strchr। যাইহোক, উভয় ক্ষেত্রেই আপনি লুপের জন্য একটি ব্যবহার করতে পারেন এবং প্রতিটি অক্ষরও পরীক্ষা করতে পারেন — লুপটি এই দুইটি মোড়ানোর জন্য প্রয়োজনীয়।

একবার আপনি যখন জানতে পারবেন যে কীভাবে পরবর্তী অক্ষরটিকে একটি শুরুর অবস্থান দেওয়া হয়, আপনি ক্রমাগত আপনার অনুসন্ধানকে এগিয়ে যান (অর্থাত একটি লুপ ব্যবহার করুন), গমন করার সাথে সাথে আপনি গণনা করছেন।


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 জিসিসির জন্য সুনির্দিষ্ট এবং এমনকি এই সংকলকটি সহ এটি কেবল প্রাকম্পম্পাইল শিরোনামগুলিতে ব্যবহারের জন্য intended
আর্থার ট্যাকা


2

আপনি স্ট্রিং ফাংশন ব্যবহার করে উত্স স্ট্রিংয়ে '_' এর উপস্থিতি খুঁজে পেতে পারেন। ফাইন্ড () ফাংশনটি 2 টি আর্গুমেন্ট গ্রহণ করে, প্রথম - স্ট্রিং যার উপস্থিতিগুলি আমরা সন্ধান করতে চাই এবং দ্বিতীয় যুক্তি শুরুর অবস্থান নেয় sourceউইস লুপটি উত্সের স্ট্রিংয়ের সমাপ্তি অবধি উপস্থিতি সন্ধান করতে ব্যবহৃত হয়।

উদাহরণ:

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

হ্যাঁ অবশ্যই, এবং বাস্তবে আমি এটি করেছিলাম তবে ভিজ্যুয়াল স্টুডিও থেকে এসও ফর্মটিতে অনুলিপি করার সময় এটি কীভাবে বিভ্রান্ত হয়েছিল তা idk।
শিবাম ঝা

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
উপস! ভুল ভাষা।
অরবিটে হালকা ঘোড়দৌড়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.