CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Zliczanie wystąpień znaku w łańcuchu znaków
Strona 1 z 1

Zliczanie wystąpień znaku w łańcuchu znaków

Nowy postNapisane: czwartek, 20 marca 2014, 17:35
przez frodo2012
Czy istnieje jakaś gotowa funkcja, która jest w stanie policzyć ilość wystąpień wybranego znaku w łańcuchu znaków AnsiString?

Re: Zliczanie wystąpień znaku w łańcuchu znaków

Nowy postNapisane: sobota, 22 marca 2014, 11:32
przez Cyfrowy Baron
Można by prościej, ale pokażę jak to zrobić gdy zarówno przeszukiwany łańcuch znaków jak i poszukiwany znak są zdefiniowane jako String:

Dla UnicodeString:

KOD cpp:     UKRYJ  
#include <iostream>
#include <algorithm>
#include <string>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 UnicodeString tekst = "ala ma kota, a Tytus ma kolty.";
 UnicodeString znak = "a";
 wchar_t *buf = znak.c_str();

 std::wstring myString( tekst.c_str() );

 Caption =  std::count( myString.begin(), myString.end(), *buf ) ;
}


Dla AnsiString:

KOD cpp:     UKRYJ  
#include <iostream>
#include <algorithm>
#include <string>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 AnsiString tekst = "ala ma kota, a Tytus ma kolty.";
 AnsiString znak = "a";
 char *buf = znak.c_str();

 std::string myString( tekst.c_str() );

 Caption =  std::count( myString.begin(), myString.end(), *buf ) ;
}


Jak sądzę chcesz wczytywać z pliku tekst do zmiennej typu AnsiString a potem go analizować. Prościej byłoby od razu na string.



W ten sposób możesz wyszukiwać wystąpienie tylko pojedynczego znaku. Gdybyś chciał szukać wystąpienia wyrażeń, to proponuję coś takiego:

Dla UnicodeString:

KOD cpp:     UKRYJ  
#include <iostream>
#include <string>

int countSubstring(const std::wstring& str, const std::wstring& sub)
{
    if (sub.length() == 0) return 0;
    int count = 0;
    for (size_t offset = str.find(sub); offset != std::wstring::npos;
         offset = str.find(sub, offset + sub.length()))
    {
        ++count;
    }
    return count;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 UnicodeString tekst = "ale ala ma kota, a Tytus ma kolty.";


 Caption = countSubstring( tekst.c_str(), L"al" );
}


Dla AnsiString:

KOD cpp:     UKRYJ  
#include <iostream>
#include <string>

int countSubstring(const std::string& str, const std::string& sub)
{
    if (sub.length() == 0) return 0;
        int count = 0;
    for (size_t offset = str.find(sub); offset != std::string::npos;
         offset = str.find(sub, offset + sub.length()))
    {
        ++count;
    }
    return count;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 AnsiString tekst = "ale ala ma kota, a Tytus ma kolty.";


 Caption = countSubstring( tekst.c_str(), "al" );
}


Drugi sposób działa działa zarówno dla pojedynczych znaków jak i dla wyrażeń.

Re: Zliczanie wystąpień znaku w łańcuchu znaków

Nowy postNapisane: sobota, 22 marca 2014, 16:22
przez frodo2012
Dzięki! Tego mi było właśnie trzeba.

Re: Zliczanie wystąpień znaku w łańcuchu znaków

Nowy postNapisane: środa, 4 listopada 2015, 13:08
przez Arkoarek
Przydało się :) dzięki