C ++에서 문자열의 문자 발생 수 계산


199

"_"문자열 의 수를 어떻게 계산 "bla_bla_blabla_bla"합니까?


17
@jdmichal : "잘못된 초보자 질문"! = "숙제"

@ 로거 : 물론 숙제가 아닐 수도 있지만, 적어도 1) 숙제 질문을 망치는 것은 배우기에는 나쁘기 때문에 숙제는 최소한 대답으로 가정하는 것이 좋습니다. ) OP는 피드백을 제공 할 수 있고 이것이 숙제가 아니라고 말할 수 있습니다
schnaader

3
@schnaader : OP가 이것이 숙제가 아니라고 말하면 여전히 다른 사람에게는 숙제가되지 않습니까? 우리가 그들을 위해 "부패"해야합니까? 그리고 그 반대도 마찬가지입니다. C ++를 처음 접하지만 학교 밖에서 오랫동안이 질문을 할 수도 있습니다. 그들에게 "완전한"대답을 하시겠습니까? 왜 교사 (숙제)가 포스터의 특성을 질문의 내용 (태그)으로 분류해야합니까? 귀하와 내 것을 포함하여 아래의 모든 답변이 해당 태그에 관계없이 동일한 것 같습니다.

@ 로거 : 이것이 숙제가 아니라고 확신한다면 또 다른 대답을했을 것입니다. 이 경우 의사 코드 대신 완전한 C 코드로 답변했습니다. 다른 사람들을 망치는 것은 그렇게 중요하지 않습니다. 여기서 검색 할 수 있다면 Google도 검색 할 수 있습니다. 또한 무언가를 검색하는 것은 숙제를 게시하고 몇 분 후에 완전한 코드 / 솔루션을 얻는 것보다 실제로 배우는 것이 훨씬 나을 수도 있습니다 (최선은 아니지만).
schnaader

2
@ schnaader : 거기에 32 개의 답변이 있으며 정렬 순서가 다릅니다. 이 "숙제 작업 "질문에 대해 "완전한 코드"답변을 제공해서는 안된다고 생각하십니까 ? 솔직히 말해서, 여기의 질문에 대해서는 숙제와 상관없이 생각을 격려하는 것이 도움이되며, 그 이유 때문에 완전한 C 코드를 가지고있는 것보다 훨씬 나은 대답을 좋아합니다. 포스터외적인 의도가 아니라 질문 에 응답하여 도움을 받고 있습니다 .

답변:


418
#include <algorithm>

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

15
세 번째 주장은 문자 유형, 즉 큰 따옴표가 아닌 작은 따옴표입니다 ...
Emerson Xu

1
이것이 가장 좋은 대답입니다.
Konchog

작은 메모이지만 반환 유형은 일반적으로 서명됩니다. 어떤 이유로 든 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
분명히 우리는 lamba 함수와 bind2nd () 호출로 완전히 읽을 수없는 템플릿 버전을 만들 수 있습니까?
Martin Beckett

@Martin 나는 실제로 그것을 생각하고있었습니다. 불행히도 C ++ 기능 프로그래밍에 대한 나의 이해는 실제로 존재하지 않습니다.
jdmichal

8
웹 서비스를 호출하는 것이 람다보다 훨씬 더 재미있을 것이라고 생각합니다. 핵심 알고리즘은 불가피 할뿐만 아니라 다른 곳에 저장됩니다.
벤 Voigt

이것은 숙제 질문이 아닙니다. 나는 c ++을 처음 사용하고 이것을 고급 방식으로 프로그래밍하기에 충분한 C ++ 지식이 없습니다. 읽는다 : 가능한 한 작다. for 루프 등을 사용하여 간단한 방식으로 프로그래밍 할 수는 있지만 Diego 솔루션과 같은 정교한 솔루션을 찾고있었습니다. 다음에 질문의 이유에 대해 더 많은 정보를 제공 할 것입니다.
andre de boer

또한 중복을 원하지 않는 경우 연속 발생을 원할 것입니다. 예를 들어, 원하는 문자로 문자열을 나눈 후 얻을 수있는 조각 수를 계산합니다.
TheRealChx101 2016 년

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 년 후,이 대답을 보면서 나는 이것을했습니다. 이것은 독성이 있고 OK가 아닙니다. 게시물을 삭제하지 않습니다. StackOverflow에서 분위기를 전환하는 데 도움이되는이 사과를 추가하고 있습니다. OP : 죄송합니다. 제 트롤링에도 불구하고 숙제를 제대로 하셨 으면 좋겠습니다. 저와 같은 답변으로 사이트에 참여하지 않는 것이 좋습니다.


1
진심이야? 의도적으로 난독 화 된 답변이 최선이며 여기에 적합하다고 생각하십니까?

4
@Tamas : int (true)는 C ++에서 항상 1입니다.

6
진정한 구식 솔루션은 # 전체 헤더 파일 을 포함하는 대신 sprintf의 프로토 타입을 선언 합니다 !
John Dibling

5
@Tamas : 물론 그렇지는 않지만 초보자의 질문에 "답변"을하는 동안 재미가 없습니다.

11
그것을 사랑하십시오. 수치가 이중 밑줄 규칙에 위배됩니다.
Martin York

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

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

10

이름을 ... Lambda version ... :)

using namespace boost::lambda;

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

당신은 몇 가지 포함이 필요합니다 ... 나는 당신을 운동으로 남겨두고 ...


7
당신은 정말로 초보자가 이것에 대해 이해할 것이라고 생각합니까?
Josh Stodola

2
@ 조쉬 : 그것은 일부 의견 에서 유치한 웃음의 분사로 보인다 .

5
세계 최고의 프로그래머 중 일부는 지난 15 년 동안 C ++을 작성하여이를 작성할 수있을 정도로 보냈습니다.
Martin Beckett

Perl을 모르는 사람들은 그것을 재발 명해야한다고 주장합니다.
Martin Beckett

7
포함을 제외하는 것은 말도 안됩니다.
PascalVKooten

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
귀하의 답변이 제공한다고 생각하고 이전 답변에서 아직 다루지 않은 내용은 무엇입니까? 답을 수정하고 확장하십시오.
hellow

1
이 코드 스 니펫은 제한적이고 즉각적인 도움이 될 수 있습니다. 적절한 설명은 크게 장기 가치를 향상 할 보여줌으로써 이 문제에 대한 좋은 해결책이고, 다른 유사한 질문을 미래의 독자들에게 더 유용 할 것입니다. 제발 편집 당신이 만든 가정 등 일부 설명을 추가 할 답변을.
Tim Diekmann

람다 함수를 사용하여 문자가 "_"인지 확인한 다음 유효한 문자가 아닌 경우에만 카운트 만 증가합니다.
나가 파

[]( char c ){if(c =='_') return true; }모든 코드 경로에서 값을 반환하지 않았기 때문에 정의되지 않은 동작을 호출합니다
phuclv

4

검색을위한 std :: string에는 여러 가지 방법이 있지만 find는 아마도 당신이 찾고있는 것입니다. C 스타일 문자열을 의미하는 경우 strchr입니다. 그러나 두 경우 모두 for 루프를 사용하여 각 문자를 확인할 수 있습니다. 루프는 본질적으로이 두 가지를 마무리합니다.

시작 위치가 주어진 다음 문자를 찾는 방법을 알고 나면 갈수록 계속해서 검색을 진행합니다 (예 : 루프 사용).


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 이것은 6 년 전의 기존 최고 답변과 동일합니다. 이것이 무엇을 의미 했습니까? 한 가지 차이점이 있습니다.이 답변은 잘못된 헤더 파일을 사용합니다. stdc ++. h는 GCC에만 해당되며 해당 컴파일러에서도 사전 컴파일 된 헤더에만 사용됩니다.
Arthur Tacca


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

물론 그렇습니다. 실제로 그렇게했지만 Visual Studio에서 SO 형식으로 복사 할 때 어떻게 엉망이 되었습니까?
Shivam Jha

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.