CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Funkcja tekstowa ucinająca znaki

Funkcja tekstowa ucinająca znaki

dział ogólny

Funkcja tekstowa ucinająca znaki

Nowy postprzez lukagrom » poniedziałek, 11 listopada 2019, 16:31

Napisałem sobie funkcję, która w zamierzeniu ma ucinać pierwszy i ostatni znak tekstu w zmiennej typu UnicodeString. Z założenia zrobiłem przypisanie do wchar_t, gdzie korzystając z obliczania długości tekstu (wcslen()) stworzyłem nową zmienną typu wchar_t* z długością mniejszą o 2, niż badany tekst (mniejsze o pierwszy i ostatni znak). Potem za pomocą pętli for, proste przypisanie - (nowy_tekst[i]=stary_tekst[i+1] i niby wszystko działa. Jednakże wykonując program za pierwszym razem/pierwszym kliknięcie buttona - wyskakuje mi w wynik w postaci "krzaków", lecz pózniej kazde nastepne uruchomienie/klikniecie jest już zbieżne z okazaniem właściwego wyniku. I teraz sam nie wiem, czy to przypadłość środowiska, czy też moja funkcja ma jakieś braki pamięciowe, że właściwie reaguje po zainicjowaniu po n-tym razie.
KOD cpp:     UKRYJ  
UnicodeString __fastcall TForm1::first_and_Last(UnicodeString text_Ex)
{
        wchar_t* date_Text=text_Ex.w_str();
        int size_Text=wcslen(date_Text);
        int size_Result=size_Text-2;
        int i;
        wchar_t* new_Text=new wchar_t[size_Result];
        for(i=0;i<size_Result;i++)
         new_Text[i]=date_Text[i+1];
        return (UnicodeString) new_Text;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 UnicodeString days_of_Week[7]={"Monday","Tuesday","Wednesday","Thursday","Friday",
 "Saturday","Sunday"};
 for(int i=0;i<7;i++)
 {
         ListBox1->Items->Add(first_and_Last(days_of_Week[i]));
 }
}
 
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 123
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Funkcja tekstowa ucinająca znaki

Nowy postprzez lukagrom » poniedziałek, 11 listopada 2019, 17:17

Zrobiłem praktycznie to samo dla zwykłego stringa w g++ i działa bez zarzutu.
KOD cpp:     UKRYJ  
string first_and_Last(string text_Ex)
{
        const char* date_Text=text_Ex.c_str();
        int size_Text=strlen(date_Text);
        int size_Result=size_Text-2;
        int i;
        char* new_Text=new char[size_Result];
        for(i=0;i<size_Result;i++)
         new_Text[i]=date_Text[i+1];
        return (string) new_Text;
}


int main()
{
 string days_of_Week[7]={"Monday","Tuesday","Wednesday","Thursday","Friday",
 "Saturday","Sunday"};
 for(int i=0;i<7;i++)
 {
     cout<<first_and_Last(days_of_Week[i])<<endl;

 }
 
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 123
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Funkcja tekstowa ucinająca znaki

Nowy postprzez polymorphism » poniedziałek, 11 listopada 2019, 19:13

i działa bez zarzutu.

Pozory mylą ;) Masz wyciek pamięci. Tam, gdzie jest new, tam wcześniej czy później musi pojawić się delete. Już Ci chyba pisałem - nie zarządzaj ręcznie pamięcią! Od tego masz inteligentne wskaźniki i std::vector/std::string.
KOD cpp:     UKRYJ  
std::string first_and_Last(const std::string &text)
{
    if (text.size() < 3) return "";
    return { text.begin() + 1, text.end() - 1 };
}

Wersja dla UnicodeStringa:
KOD cpp:     UKRYJ  
UnicodeString first_and_Last(const UnicodeString &text)
{
        UnicodeString resultStr;
        for(size_t i = 2; i <= text.Length() - 1; ++i) resultStr += text[i];
        return resultStr;
}

Jak widać, można bez new, tablic, funkcji C i wycieków pamięci ;)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: Funkcja tekstowa ucinająca znaki

Nowy postprzez lukagrom » poniedziałek, 11 listopada 2019, 20:11

Danke. Ja szukałem jescze w tym deseniu (bez new/delete]) coś automatycznego, co używają typy tekstowe i w poradach odnalazłem starego/poczciwego Stringa, którego jeszcze Borland zaadoptowałdo Buildera prosto z Delphi.
KOD cpp:     UKRYJ  
String __fastcall TForm1::first_and_Last(String text)
{

 text.Delete(1,1);
 text.Delete(text.Length(),1);
 return text;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 AnsiString days_of_Week[7]={"Monday","Tuesday","Wednesday","Thursday","Friday",
 "Saturday","Sunday"};
 for(int i=0;i<7;i++)
 {
  ListBox1->Items->Add(first_and_Last(days_of_Week[i]));
 }
}

 
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 123
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Funkcja tekstowa ucinająca znaki

Nowy postprzez polymorphism » wtorek, 12 listopada 2019, 11:44

Ten "stary/poczciwy" String to nic innego jak alias typu AnsiString/UnicodeString.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: Funkcja tekstowa ucinająca znaki

Nowy postprzez Cyfrowy Baron » czwartek, 28 listopada 2019, 16:24

String w zależności od ustawień projektu reprezentuje typ AnsiString lub UnicodeString. W nowych środowiskach domyślnie jest to UnicodeString.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox


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 13 gości

cron