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