Erster Buchstabe eines Strings



  • Dann hast du aber das Probelem, dass du unter Umständen Fehler beim Zählen bekommst wenn ein User einen String korrigiert. Du müsstest also auch dekrementieren wenn ein Buchstabe entfernt wird.



  • Hallo,

    Ja, hast Du denn einen Vorschlag wie ich das realisieren kann/könnte?
    oder sagen wir mal so - mache ich das in einer for-Schleife oder in einer if-Schleife?

    Danke schon mal im voraus
    mfg Thorsten:)



  • Hi,
    du erstellst einfach eine Membervariable vom Typ CString für das Eingabefeld mit dem Klassenassistenten. Danach fügst du, wie schon "DaDaywalker" beschrieben hat die Funktion OnChange für das Eingabefeld hinzu.
    Da schreibst du folgenden Code rein:

    UpdateData();
    m_iAnzahlBuchstaben = m_sName.GetLength();    // m_iAnzahlBuchstaben ist die Variable des Editfeldes in dem die Anzahl der Buchstaben stehen soll. m_sName ist die Variable des Editfeldes in dem der Benutzer den String eingibt.
    UpdateData(FALSE);
    

    Edit:
    Falls du aber nur die Buchstaben und nicht die Anzahl der Zeichen zählen willst,
    dann schreib einfach folgendes rein:

    UpdateData();
    int iZähler = 0;
    for(int i = 0;i < m_sName.GetLength();i++)
    {
        if(TestBuchstabe(m_sName[i]))
        {
          iZähler++;
        }
    }
    m_iAnzahlBuchstaben = iZähler;
    

    und in die Funktion TestBuchstabe schreibste folgenden Code:

    BOOL CDeinDlg::TestBuchstabe(char cZeichen)
    {
        CString sBuchstaben = "abcdefghijklmnopqrstuvwxyzäöüß",sZeichen = "";
    
        sZeichen.SetAt(0,cZeichen);   // Hier wird ein eventueller Großbuchstabe zu einem Kleinbuchstaben umgewandelt
        sZeichen.MakeLower();
        cZeichen = sZeichen.GetAt(0);
    
        int iResult = sBuchstaben.Find(cZeichen);
    
        if(iResult != -1)
                return TRUE;
            return FALSE;
    }
    

    So, ich hoffe das hilft dir.
    mfg takeiteasy

    [ Dieser Beitrag wurde am 01.01.2003 um 22:07 Uhr von takeiteasy editiert. ]



  • Hallo takeiteasy 🙂

    dein vorschlag ist nicht ganz so das was ich brauche, aber dein Code ist trotzdem sehr informativ, danke dafür erstmal 🙂

    Mein Problem bzw. eine erleichterung wie ich denke, ist wenn ich z.B. einen Namen habe der mitA anfängt, soll im anderen Editfeld 10100 stehen, wenn ein B der erste Buchstabe ist, soll im anderen Editfeld 10200 stehen usw. der Startwert müßte also 10000 sein.
    Da hat MaSTaH ganz recht, dieser müßte dann auch zurückzählen (Danke übrigens MaSTaH, hätte ich überhaupt nicht daran gedacht 😃 )

    Danke nochmal für die Mühe 🙂
    mfg Thorsten



  • Hi nochmal,
    ach so meinst du das. Ich bin mir jetzt nicht mehr so sicher, ob ich weiß, was du meinst.
    Sehe ich das richtig, dass du einen Startwert von 10000 hast und in dem Editfeld die Nummer des Anfangsbuchstaben im Alphabet * 100 + Startwert stehen soll ?
    Also mein zweiter Anlauf *g*
    Schreib folgendes:

    // das hier kommt an den Anfang der Header-Datei
    #define STARTWERT 10000
    
    // Das hier in die Funktion OnChange schreiben
    UpdateData();
    CString sBuchstaben = "abcdefghijklmnopqrstuvwxyz",sZeichen = "";
    int iBuchstabenNummer;
    
    // Ersten Buchstaben in Kleinbuchstaben umwandeln, falls Großbuchstabe
    sZeichen.SetAt(0,m_sName.GetAt(0));
    sZeichen.MakeLower();
    
    // Buchstabennummer ermitteln
    int iResult = sBuchstaben.Find(sZeichen.GetAt(0));
    if(iResult != -1)
    {
        iBuchstabenNummer = iResult++;
        // Wert errechnen und ausgeben
        m_iWert = (iBuchstabenNummer * 100) + STARTWERT;
    }
    else
    {
        // Das was zu tun ist, wenn erstes Zeichen kein Buchstabe ist z.B:
        MessageBox("Bitte verwenden sie für den Namen nur Buchstaben und keine Sonderzeichen");
    }
    UpdateData(FALSE);
    

    So, ich hoffe das das jetzt etwas hilft *hoff*

    Edit:
    ein paar kleine Schreibfehler beseitigt 🙂

    mfg takeiteasy

    [ Dieser Beitrag wurde am 02.01.2003 um 01:53 Uhr von takeiteasy editiert. ]



  • Hi takeiteasy 🙂

    Super, genau das habe ich gesucht :p
    nur gibt es da ein kleines problem 😕

    Wenn ich einen Buchstaben eingebe, und weitere eingebe
    kommt die Fehlermeldung
    " Debug Assertion Failed!"
    File strcore.cpp
    Line 604
    Drücke ich dann auf Ignorieren
    kommt die nächste
    File afx.inl
    Line 170

    hmm, weißt Du was das bedeutet?

    Ich habe leider noch keine Ahnung vom Debugger 😡

    mfg Thorsten 🙂



  • Du machst ein SetAt mit einem ungültigen Index. d.h. wenn ein String z.B. 10 Zeichen lang ist, dann ist der Index -1 genauso ungültig wie der Index 10 (weil: elftes Zeichen nicht vorhanden). Beim Index fängst du nicht bei 1 an zu zählen, sondern bei 0 (mal ganz platt ausgedrückt)



  • Hi nochmal,
    @MaSTaH:
    Ich weiß schon, dass ein CString Nullbasierend ist.

    Hab nur nen kleinen Fehler gemacht, der String muss vorher schon ein Zeichen lang sein. Naja, hier der getestete Code:

    // Wieder das Startwert Makro an den Anfang der Quellcodedatei:
    #define STARTWERT 10000
    
    // Folgendes in die Funktion OnChange:
        // Das hier in die Funktion OnChange schreiben
        UpdateData();
        CString sBuchstaben = "abcdefghijklmnopqrstuvwxyz",sZeichen = "1"; // Der String ist 1 Zeichen lang
        int iBuchstabenNummer;
    
        // Ersten Buchstaben in Kleinbuchstaben umwandeln, falls Großbuchstabe
        if(m_sName.GetLength() > 0)   // Wenn kein Name eingegeben, dann kann man auch nichts umwandeln
        {
            sZeichen.SetAt(0,m_sName.GetAt(0));
            sZeichen.MakeLower();
        }
        else
        {
            m_iWert = 0;  // Wenn nichts eingegeben, dann Wert auf 0 setzen
        }
    
        // Buchstabennummer ermitteln
        int iResult = sBuchstaben.Find(sZeichen.GetAt(0));
        if(iResult != -1)  // Find liefert -1 zurück, wenn nichts gefunden wurde
        {
            iBuchstabenNummer = iResult + 1;  // nicht iResult++ sonst speichert er es nicht in iBuchstabenNummer
            // Wert errechnen und ausgeben
            m_iWert = (iBuchstabenNummer * 100) + STARTWERT;
        }
        else if(m_sName.GetLength() > 0)   // Wenn kein Name eingegeben, dann soll auch keine Warnung kommen
        {
            // Das was zu tun ist, wenn erstes Zeichen kein Buchstabe ist z.B:
            MessageBox("Bitte verwenden sie für den Namen nur Buchstaben und keine Sonderzeichen");
        }
        UpdateData(FALSE);
    

    So, dass funktioniert jetzt.
    Entschuldige die Fehler.

    mfg takeiteasy



  • Hey takeiteasy,

    danke, genial 🙂

    so simpel, ich glaub es nicht 😕
    woher könnt ihr alle diese Funktionen aus der MFC, klar Lesen - aber wie behaltet ihr das alles 😕

    Bin ich doch zu Alt für diesen Sch..., mit 37 😕

    mfg Thorsten 🙂



  • Hi,
    freut mich, dass ich dir helfen konnte.
    Wie ich mir das merke ? Nun ja, ich bin Schüler (17)
    und habe somit (noch) genug Zeit um jeden Tag mehrere Stunden
    zu programmieren. Da vertieft sich das schon.

    mfg takeiteasy


Anmelden zum Antworten