Zeichen an einer bestimmten stelle in einem String auslesen [Anfänger]



  • Hallo,
    Ich wollte zur Übung einen Taschenrechner Programmieren, da man ja nur ein Komma setzen darf habe ich versucht eine Abfrage einzubauen:

    void __fastcall TForm2::B_KommaClick(TObject *Sender)
    {
    for (i = 0; i == TF_Eingabe->Text.Length(); i++)
    	{
    		if (TF_Eingabe->Text[i] == ",")
    		{
    			Fehler = true;
    		}
    	}
    	if (Fehler != true)
    	{
    		TF_Eingabe->Text = TF_Eingabe->Text + ",";
    	}
    	else
    		ShowMessage("Es kann kein zweites Komma gesetzt werden!");
    

    Doch in der Zeile

    if (TF_Eingabe->Text[i] == ",")
    

    bei "==" tritt folgender Fehler auf:

    [BCC32 Fehler] Unit2.cpp(76): E2034 Konvertierung von 'wchar_t' nach 'const char *' nicht möglich

    Es würde mich motivieren wenn ich schnelle Hilfe bekomme 😛

    mfg Zuluhutu



  • //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm2 *Form2;
    
    double Zahl, Eingabewert1, Eingabewert2, Ausgabe;
    int i, Laenge;
    bool Fehler;
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
    	: TForm(Owner)
    {
    
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::B_1Click(TObject *Sender)
    {
    	TF_Eingabe->Text = TF_Eingabe->Text + "1";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::B_2Click(TObject *Sender)
    {
    	TF_Eingabe->Text = TF_Eingabe->Text + "2";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::B_3Click(TObject *Sender)
    {
    	TF_Eingabe->Text = TF_Eingabe->Text + "3";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::B_4Click(TObject *Sender)
    {
    	TF_Eingabe->Text = TF_Eingabe->Text + "4";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::B_5Click(TObject *Sender)
    {
    	TF_Eingabe->Text = TF_Eingabe->Text + "5";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::B_6Click(TObject *Sender)
    {
    	TF_Eingabe->Text = TF_Eingabe->Text + "6";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::B_7Click(TObject *Sender)
    {
    	TF_Eingabe->Text = TF_Eingabe->Text + "7";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::B_8Click(TObject *Sender)
    {
    	TF_Eingabe->Text = TF_Eingabe->Text + "8";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::B_9Click(TObject *Sender)
    {
    	TF_Eingabe->Text = TF_Eingabe->Text + "9";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::B_0Click(TObject *Sender)
    {
    	TF_Eingabe->Text = TF_Eingabe->Text + "0";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::B_KommaClick(TObject *Sender)
    {
    for (i = 0; i == TF_Eingabe->Text.Length(); i++)
    	{
    		if (TF_Eingabe->Text[i] == ",")
    		{
    			Fehler = true;
    		}
    	}
    	if (Fehler != true)
    	{
    		TF_Eingabe->Text = TF_Eingabe->Text + ",";
    	}
    	else ShowMessage("Es kann kein zweites Komma gesetzt werden!");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::B_ACClick(TObject *Sender)
    {
    	TF_Eingabe->Clear();
    	Zahl = 0;
    	Ausgabe = 0;
    	Eingabewert1 = 0;
    	Eingabewert2 = 0;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::B_DividierenClick(TObject *Sender)
    {
    if (TF_Eingabe->Text != "" && Zahl == 0)
    	{
    		Zahl = 1;
    		Eingabewert1 = StrToFloat(TF_Eingabe->Text);
    		TF_Eingabe->Clear();
    	}
    	else if (Zahl == 2 || Zahl == 3 || Zahl == 4)
    	{
    		Zahl = 1;
    	}
    	else ShowMessage("Bitte Wert eingeben!");
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::B_ErgebnisClick(TObject *Sender)
    {
    	if (Zahl == 0 || TF_Eingabe->Text == "")
    	{
    		ShowMessage("Bitte alle eingaben machen!");
    	}
    	if (Zahl == 1)
    	{
    		Eingabewert2 = StrToFloat(TF_Eingabe->Text);
    		Ausgabe = Eingabewert1 / Eingabewert2;
    		TF_Eingabe->Text = FloatToStr(Ausgabe);
    	}
    	if (Zahl == 2)
    	{
    		Eingabewert2 = StrToFloat(TF_Eingabe->Text);
    		Ausgabe = Eingabewert1 * Eingabewert2;
    		TF_Eingabe->Text = FloatToStr(Ausgabe);
    	}
    	if (Zahl == 3)
    	{
    		Eingabewert2 = StrToFloat(TF_Eingabe->Text);
    		Ausgabe = Eingabewert1 - Eingabewert2;
    		TF_Eingabe->Text = FloatToStr(Ausgabe);
    	}
    	if (Zahl == 4)
    	{
    		Eingabewert2 = StrToFloat(TF_Eingabe->Text);
    		Ausgabe = Eingabewert1 + Eingabewert2;
    		TF_Eingabe->Text = FloatToStr(Ausgabe);
    	}
    		Zahl = 0;
    		Ausgabe = 0;
    		Eingabewert1 = 0;
    		Eingabewert2 = 0;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::B_MultiplizierenClick(TObject *Sender)
    {
    	if (TF_Eingabe->Text != "" && Zahl == 0)
    	{
    		Zahl = 2;
    		Eingabewert1 = StrToFloat(TF_Eingabe->Text);
    		TF_Eingabe->Clear();
    	}
    	else if (Zahl == 1 || Zahl == 3 || Zahl == 4)
    	{
    		Zahl = 2;
    	}
    	else ShowMessage("Bitte Wert eingeben!");
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::B_SubtrahierenClick(TObject *Sender)
    {
    if (TF_Eingabe->Text != "" && Zahl == 0)
    	{
    		Zahl = 3;
    		Eingabewert1 = StrToFloat(TF_Eingabe->Text);
    		TF_Eingabe->Clear();
    	}
    	else if (Zahl == 1 || Zahl == 2 || Zahl == 4)
    	{
    		Zahl = 3;
    	}
    	else ShowMessage("Bitte Wert eingeben!");
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::B_PlusClick(TObject *Sender)
    {
    if (TF_Eingabe->Text != "" && Zahl == 0)
    	{
    		Zahl = 4;
    		Eingabewert1 = StrToFloat(TF_Eingabe->Text);
    		TF_Eingabe->Clear();
    	}
    	else if (Zahl == 1 || Zahl == 2 || Zahl == 3)
    	{
    			Zahl = 4;
    	}
    	else ShowMessage("Bitte Wert eingeben!");
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::FormCreate(TObject *Sender)
    {
    	Zahl = 0;
    	Fehler = false;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::B_CClick(TObject *Sender)
    {
    	Laenge = TF_Eingabe->Text.Length();
    	TF_Eingabe->Text = TF_Eingabe->Text.SetLength(Laenge - 1);
    }
    //---------------------------------------------------------------------------
    


  • Du prüfst ja nur ein einzelnes Zeichen eines Strings, mit dem Indexoperator bei einem String greifst du eben nur auf ein einzelnes solches Zeichen zu, das ist dann kein String mehr, sondern ein char, dementsprechend versuch's mal damit:

    if (TF_Eingabe->Text[i] == ',')
    


  • Soweit ich weis nimmt nur Delphi diese zeichen

    ''
    

    oder nicht?

    if (TF_Eingabe->Text[i] == ','
    

    diese Lösung hat jedenfalls nicht funktioniert aber trotzdem danke an Powerpaule 🙂 👍

    ich hoffe mir kann trotzdem jemand weiterhelfen 😕

    mfg Zuluhutu



  • for (i = 0; i == TF_Eingabe->Text.Length(); i++) 
        { 
            if (TF_Eingabe->Text[i] == ",") 
            { 
                Fehler = true; 
            } 
        } 
        if (Fehler != true) 
        { 
            TF_Eingabe->Text = TF_Eingabe->Text + ","; 
        } 
        else ShowMessage("Es kann kein zweites Komma gesetzt werden!"); 
    }
    

    Der AnsiString beginnt grundsätzlich mit dem Index 1 und nicht wie std::string bei 0. Außerdem bietet auch der AnsiString die Methode SubStr um auf einzelne Zeichen zuzugreifen.
    Und der AnsiString bietet sogar noch die Methode "Pos" an. Mit der kann man auf das erste Vorkommen eines bestimmten Zeichens bzw. Zeichenfolge prüfen.

    if(Eingabe->Text.Pos(",") > 0)
       {
          ShowMessage("Es kann kein zweites Komma gesetzt werden!");
       }
    


  • "Funktioniert nicht" ist nicht aussagekräftig genug.
    Deine ursprüngliche Fehlermeldung sollte jedenfalls mit Paules Hinweis behoben sein.

    Beachte ausserdem, dass bei AnsiString der Index nicht bei 0 sondern bei 1 beginnt.

    /Edit: Ähh ja, genau. 🙂



  • 1000 Dank an AnsiStr für diese Lösung 😃

    if(Eingabe->Text.Pos(",") > 0)
       {
          ShowMessage("Es kann kein zweites Komma gesetzt werden!");
       }
    

    nun läufts 👍

    mfg Zuluhutu



  • hätte man das nicht auch einfach mit:
    String.substr(int,int) machen können ist doch viel einfacher



  • damit kannste aber nicht überprüfen ob ein "," irgendwo ist.

    greetz KN4CK3R



  • Natürlich.

    int size;
    int i;
    std::string teil;
    std::string text;
    text = Label1->Caption.c_str();
    size = text.size();
    while (i<size)
    {
         i++
         teil = text.substr(i-1,1);
         if (teil == ",")
         {
           break;
         }
    }
    

    vielleicht nicht elegant, aber es geht und ist unkompliziert.



  • also .Pos() sieht für mich einfacher aus...

    greetz KN4CK3R



  • Tim06TR schrieb:

    Natürlich.

    int size;
    int i;
    std::string teil;
    std::string text;
    text = Label1->Caption.c_str();
    size = text.size();
    while (i<size)
    {
         i++
         teil = text.substr(i-1,1);
         if (teil == ",")
         {
           break;
         }
    }
    

    vielleicht nicht elegant, aber es geht und ist unkompliziert.

    Es ist nicht nur nicht elegant. Es ist komplizierter Code.(nicht vom Verständniss her :D)
    Die AnsiString Methode Pos erledigt genau das was gebraucht wird. Die
    Suche im String.
    Und für std::string gibt es find ... 🙄



  • Hallo

    Zumal man nicht substr braucht um auf ein einzelnes Zeichen eines Strings zurückzugreifen. Denn deine Schleife greift ja auch nur auf ein Zeichen pro Durchgang zurück, da reicht es den []-Operator zu benutzen und das Ergebnis als char und nicht als char* zu betrachten.

    bis bald
    akari



  • Beispiel zu akari's Einwand:

    for(int i= TF_Eingabe->Text.Length(); i > 0; i--){
        if(TF_Eingabe->Text->Caption[i] == ','){
            ShowMessage("Es kann kein zweites Komma gesetzt werden!");
            return;                                                    // Click-Methode wird sofort verlassen, weitere Verarbeitung entfällt
        }
    }
    TF_Eingabe->Text= TF_Eingabe->Text + ",";
    

    MfG


Anmelden zum Antworten