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

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

dział ogólny

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

Nowy postprzez frodo2012 » czwartek, 20 marca 2014, 17:35

Czy istnieje jakaś gotowa funkcja, która jest w stanie policzyć ilość wystąpień wybranego znaku w łańcuchu znaków AnsiString?
Avatar użytkownika
frodo2012
Bladawiec
Bladawiec
 
Posty: 2
Dołączył(a): niedziela, 22 września 2013, 21:33
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++
Gadu Gadu: 0
    Windows 7Opera

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

Nowy postprzez Cyfrowy Baron » sobota, 22 marca 2014, 11:32

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ń.

Za ten post autor Cyfrowy Baron otrzymał podziękowania - 2:
Arkoarek, frodo2012
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

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

Nowy postprzez frodo2012 » sobota, 22 marca 2014, 16:22

Dzięki! Tego mi było właśnie trzeba.
Avatar użytkownika
frodo2012
Bladawiec
Bladawiec
 
Posty: 2
Dołączył(a): niedziela, 22 września 2013, 21:33
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++
Gadu Gadu: 0
    Windows 7Firefox

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

Nowy postprzez Arkoarek » środa, 4 listopada 2015, 13:08

Przydało się :) dzięki
Avatar użytkownika
Arkoarek
Bladawiec
Bladawiec
 
Posty: 21
Dołączył(a): środa, 16 października 2013, 14:51
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: Borland C++Builder 6
Gadu Gadu: 0
    Windows XPFirefox


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości

cron