minicrispie: C++ - Problem *Hilfe*

Hallo an alle,

ich hab schon wieder ein Problem :-(
Ich möchte mit C/C++ (WinApi) ein Programm schreiben, was jeden Buchstaben durch einen anderen ersetzt.
Der Benutzer gibt einen Text ein(Edit-Fenster). Nach einem Klick auf "OK" wird der (gesamte)Text umgearbeitet und in einem nebenstehenden Edit-Fenster wieder ausgegeben.

Das mit der Darstellung bekomme ich hin. Aber an der "Ersetzen-Funktion" scheitert es. ich hab auch schon verzweifelt das Internet durchforstet...

also im prinzip brauch ich die Funktion in C/C++:

var Text = document.getElementById('Eingabe').value;
var Zeichen=0;

for(var i=0; i<Text.length; i++)
{
var Buchstabe=Text.charAt(Zeichen);

//Umwandlung

document.getElementById('Eingabe').value=document.getElementById('Eingabe').value+Buchstabe;
Zeichen++;
}

hat jemand irgendwelche kreativen Vorschläge ?

Bin für jeden Tipp dankbar !

--
Wo die Sprache aufhört, fängt die Musik an...
ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
  1. Hallo,

    Ich möchte mit C/C++ (WinApi) ein Programm schreiben, was jeden Buchstaben durch einen anderen ersetzt.

    okay, hört sich einfach an.

    Das mit der Darstellung bekomme ich hin. Aber an der "Ersetzen-Funktion" scheitert es.

    Oh, ich hätte eher vermutet, dass man an den anspruchsvolleren Dingen scheitert, nicht an den Basics. Also was haben wir:
     * Die Länge eines Strings erhält man in C nur umständlich, aber wenn man
       Schritt für Schritt durchgeht, findet man das Ende leicht: Ein Nullbyte
     * Ein String wird durch einen Zeiger auf Zeichen oder durch ein Array von
       Zeichen dargestellt; in beiden Fällen kann man mit dem Index-Operator []
       auf die einzelnen Zeichen zugreifen, im Falle des Zeigers außerdem auf
       das erste Zeichen mit dem Dereferenzierungs-Operator *
     * Nun musst du nur noch wissen, *was* du an der Stelle jedes Zeichens neu
       zuweisen möchtest

    Beispiel:

    int ModifyString(char *string)
     { int i;

    while (string[i]!=0)        // ein Nullbyte markiert in C das String-Ende
        { string[i] = AnotherChar; // hier Ersatzwert eintragen
          i++;                     // Index erhöhen
        }                          // und weiter
       return (0);                 // ein Dummy-Rückgabewert der Form halber
     }

    Der Rückgabewert hat hier nicht wirklich viel Sinn, ich lege meine Funktionen aber gern so an, dass sie einen Fehlercode zurückgeben - normalerweise gilt 0 dann als "alles okay".

    Wenn man das jetzt noch ein wenig kürzen möchte, kann man auf die Schleifenvariable auch verzichten und stattdessen direkt den Zeiger weiterrücken; die Increment-Operation kann man in die Zuweisung hineinpacken und schließlich den expliziten Vergleich mit 0 eliminieren:

    int ModifyString(char *string)
     { while (*string)
          *string++ = AnotherChar;
       return (0);
     }

    Für mich ist diese kompakte, komprimierte Schreibweise klarer, aber da sind manche Leute anscheinend anderer Meinung. ;-)

    So long,
     Martin

    --
    Okay, Alkohol ist keine Antwort.
    Aber manchmal vergisst man beim Trinken wenigstens die Frage.
    1. Hi,

      Oh, ich hätte eher vermutet, dass man an den anspruchsvolleren Dingen scheitert, nicht an den Basics.

      Hätte ich mir auch gedacht, aber vielleicht gibt es ja dafür einen GUI-Builder, mit dem man die GUI nur noch zusammenklicken muss.

      * Die Länge eines Strings erhält man in C nur umständlich, aber wenn man
         Schritt für Schritt durchgeht, findet man das Ende leicht: Ein Nullbyte

      Aber nur wenn man auf die Verwendung von Libs verzichtet.
      In der C-Bibliothek string.h gibt es die Funktion strlen() die die Länge eines Strings zurück gibt.
      Unter C++ kann man auch gleich die String-Klasse verwenden, die eine Methode length() hat.
      Dass das so umständlich ist finde ich nicht, aber in diesem Fall kann man auch darauf verzichten.

      Beispiel:

      int ModifyString(char *string)
      { int i;

      Wohl nur ein Flüchtigkeitsfehler, aber ein ganz böser!
      Lokale Variablen müssen initialisiert werden, bevor sie das erste mal benutzt werden, sonst haben sie einen Zufallswert.
      Falls es deswegen zu Fehlern kommt sucht man diese ewig.

      while (string[i]!=0)        // ein Nullbyte markiert in C das String-Ende
          { string[i] = AnotherChar; // hier Ersatzwert eintragen
            i++;                     // Index erhöhen
          }                          // und weiter
         return (0);                 // ein Dummy-Rückgabewert der Form halber
      }

      int ModifyString(char *string)
      { while (*string)
            *string++ = AnotherChar;
         return (0);
      }

      Für mich ist diese kompakte, komprimierte Schreibweise klarer, aber da sind manche Leute anscheinend anderer Meinung. ;-)

      Für Anfänger ist die Schreibweise mit dem Index (erste Version) wohl leichter zu verstehen, aber die zweite bringt Performance-Vorteile, da hier nicht jedesmal von &string[0] zu zählen begonnen werden muss, sondern direkt der Wert auf den der Pointer zeigt benutzt wird.

      Aber ich glaube es ging minicrispie auch noch darum, wie der die Textfelder aus dem Formular ansprechen kann. Das weiß ich aber nicht, da ich mich nie mit der WinAPI befasst habe.
      Aber auch wenn ich es wissen würde könnte ich wohl nur bedingt helfen, da dafür wohl auch noch der Quellcode, wie das Formular genau umgesetzt wurde, von Bedeutung ist.

      mfG,
      steckl

      1. Hallo,

        Oh, ich hätte eher vermutet, dass man an den anspruchsvolleren Dingen scheitert, nicht an den Basics.
        Hätte ich mir auch gedacht, aber vielleicht gibt es ja dafür einen GUI-Builder, mit dem man die GUI nur noch zusammenklicken muss.

        gibt es bestimmt - aber minicrispie schrieb ja ausdrücklich "WinApi".

        * Die Länge eines Strings erhält man in C nur umständlich, aber wenn man
           Schritt für Schritt durchgeht, findet man das Ende leicht: Ein Nullbyte

        Aber nur wenn man auf die Verwendung von Libs verzichtet.
        In der C-Bibliothek string.h gibt es die Funktion strlen() die die Länge eines Strings zurück gibt.

        Ja, aber auch die schafft das nur, indem sie bei jedem Aufruf den String von Anfang an nach dem abschließenden Nullbyte durchsucht. Also sehr umständlich.

        Unter C++ kann man auch gleich die String-Klasse verwenden, die eine Methode length() hat.

        Okay, kann man. Wenn ich kann, meide ich C++ zugunsten von "echtem" C.

        int ModifyString(char *string)
        { int i;
        Wohl nur ein Flüchtigkeitsfehler, aber ein ganz böser!

        Jaaa, hast recht. Als ich anfing, hatte ich noch eine for-Schleife im Sinn, bei der die Initialisierung im Schleifenkopf gekommen wäre.

        Lokale Variablen müssen initialisiert werden, bevor sie das erste mal benutzt werden, sonst haben sie einen Zufallswert.

        Richtig. Tückisch nur, dass dieser Zufallswert - eben das, was zufällig so auf dem Stack rumlungert - oft 0 ist, so dass dieser Fehler lange unbemerkt schlummern kann.

        Aber ich glaube es ging minicrispie auch noch darum, wie der die Textfelder aus dem Formular ansprechen kann.

        Glaube ich nicht, denn:

        Der Benutzer gibt einen Text ein(Edit-Fenster). Nach einem Klick auf "OK" wird der (gesamte)Text umgearbeitet und in einem nebenstehenden Edit-Fenster wieder ausgegeben.
        Das mit der Darstellung bekomme ich hin.

        Aber auch wenn ich es wissen würde könnte ich wohl nur bedingt helfen, da dafür wohl auch noch der Quellcode, wie das Formular genau umgesetzt wurde, von Bedeutung ist.

        Richtig. Aber wahrscheinlich meldet sich der OP nochmal.

        Ciao,
         Martin

        --
        F: Was ist schneller: Das Licht oder der Schall?
        A: Offensichtlich der Schall. Wenn man den Fernseher einschaltet, kommt immer erst der Ton, und dann erst das Bild.
        1. Hi,

          Hätte ich mir auch gedacht, aber vielleicht gibt es ja dafür einen GUI-Builder, mit dem man die GUI nur noch zusammenklicken muss.

          gibt es bestimmt - aber minicrispie schrieb ja ausdrücklich "WinApi".

          Schließt der Begriff "WinApi" aus, dass ein GUI-Builder verwendet wurde?

          int ModifyString(char *string)
          { int i;
          Wohl nur ein Flüchtigkeitsfehler, aber ein ganz böser!

          Jaaa, hast recht. Als ich anfing, hatte ich noch eine for-Schleife im Sinn, bei der die Initialisierung im Schleifenkopf gekommen wäre.

          Ich habe mir angewöhnt immer "= 0" bei der Variablendefinition dahinter zu schreiben. Lieber einmal zu oft als zu wenig.

          Richtig. Tückisch nur, dass dieser Zufallswert - eben das, was zufällig so auf dem Stack rumlungert - oft 0 ist, so dass dieser Fehler lange unbemerkt schlummern kann.

          Spätestens beim Kunden steht dann keine 0 mehr drin.

          Aber ich glaube es ging minicrispie auch noch darum, wie der die Textfelder aus dem Formular ansprechen kann.

          Glaube ich nicht, denn:

          Der Benutzer gibt einen Text ein(Edit-Fenster). Nach einem Klick auf "OK" wird der (gesamte)Text umgearbeitet und in einem nebenstehenden Edit-Fenster wieder ausgegeben.
          Das mit der Darstellung bekomme ich hin.

          Ja, da steht nichts davon, aber er wollte eine Übersetzung von "document.getElementById()".

          mfG,
          steckl

          1. Hallo,

            Hätte ich mir auch gedacht, aber vielleicht gibt es ja dafür einen GUI-Builder, mit dem man die GUI nur noch zusammenklicken muss.
            gibt es bestimmt - aber minicrispie schrieb ja ausdrücklich "WinApi".
            Schließt der Begriff "WinApi" aus, dass ein GUI-Builder verwendet wurde?

            meiner Ansicht nach ja. Wenn jemand sagt, er verwende das/die Windows-API, dann verstehe ich das so, dass derjenige auch für die GUI-Programmierung *nur* API-Funktionen verwendet. So gehe ich vor, wenn ich Windows-Applikationen programmiere: Keine Fremdbibliotheken, GUI-Design nur anhand von Windows-Ressourcen.

            Jaaa, hast recht. Als ich anfing, hatte ich noch eine for-Schleife im Sinn, bei der die Initialisierung im Schleifenkopf gekommen wäre.
            Ich habe mir angewöhnt immer "= 0" bei der Variablendefinition dahinter zu schreiben. Lieber einmal zu oft als zu wenig.

            Keine schlechte Idee. :-)

            Richtig. Tückisch nur, dass dieser Zufallswert - eben das, was zufällig so auf dem Stack rumlungert - oft 0 ist, so dass dieser Fehler lange unbemerkt schlummern kann.
            Spätestens beim Kunden steht dann keine 0 mehr drin.

            Richtig. Erst dann wieder, wenn der Programmierer oder Support-Mitarbeiter an der Maschine sitzt, den Rechner frisch gebootet hat und feststellt: Geht doch!

            Schönen Abend noch,
             Martin

            --
            Fettflecke werden wieder wie neu, wenn man sie regelmäßig mit etwas Butter einschmiert.
            1. Hi,

              Richtig. Tückisch nur, dass dieser Zufallswert - eben das, was zufällig so auf dem Stack rumlungert - oft 0 ist, so dass dieser Fehler lange unbemerkt schlummern kann.
              Spätestens beim Kunden steht dann keine 0 mehr drin.

              Richtig. Erst dann wieder, wenn der Programmierer oder Support-Mitarbeiter an der Maschine sitzt, den Rechner frisch gebootet hat und feststellt: Geht doch!

              Frei nach Murphy's Law.

              mfG,
              steckl

              1. Hi an alle,

                @Frank Schönmann: HAHA ... ich lach mich tot!
                Sehr schöner beitrag, wenn da nicht stehen würde "WinApi".

                @steckl:

                »»Für Anfänger ist die Schreibweise mit dem Index (erste Version) wohl leichter zu verstehen, aber die zweite bringt Performance-Vorteile, da hier nicht jedesmal von &string[0] zu zählen begonnen werden muss, sondern direkt der Wert auf den der Pointer zeigt benutzt wird.

                Ok...ich bin Anfänger^^
                ich wähle ... äääähhhhmm ... die erste Methode xD

                Schließt der Begriff "WinApi" aus, dass ein GUI-Builder verwendet wurde?

                In dem Falle ja, da ich so ein GUI-Builder <u>nicht</u> habe *schön wärs ja*

                @Martin:

                »»Richtig. Aber wahrscheinlich meldet sich der OP nochmal.

                Mach ich gerade ^^

                Aber ich glaube es ging minicrispie auch noch darum, wie der die Textfelder aus dem Formular ansprechen kann.

                »»Glaube ich nicht, denn:

                In der Tat weiß ich, wie ich den Inhalt eines Textfeldes abfragen und in einer Variablen speichern kann.

                Ok. ich probiers mal mit der von Martin genannten Methode...

                Thx.

                --
                Wo die Sprache aufhört, fängt die Musik an...
                ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
                1. Hallo,

                  Schließt der Begriff "WinApi" aus, dass ein GUI-Builder verwendet wurde?
                  In dem Falle ja, da ich so ein GUI-Builder <u>nicht</u> habe *schön wärs ja*

                  die Visual C++ Express Edition ist kostenlos.
                  Wo ist das Problem?

                  Freundliche Grüße

                  Vinzenz

                2. hi!

                  @Frank Schönmann: HAHA ... ich lach mich tot!
                  Sehr schöner beitrag, wenn da nicht stehen würde "WinApi".

                  Nanu? Was hat die WinApi mit der String-Verarbeitung in C++ zu tun?

                  bye, Frank!

                  --
                  Never argue with an idiot. He will lower you to his level and then
                  beat you with experience.
                  1. Hallo Frank,

                    @Frank Schönmann: HAHA ... ich lach mich tot!
                    Sehr schöner beitrag, wenn da nicht stehen würde "WinApi".

                    Nanu? Was hat die WinApi mit der String-Verarbeitung in C++ zu tun?

                    Da ich ne WinApi mit C++ programmiere hat das sehr viel damit zutun...

                    --
                    Wo die Sprache aufhört, fängt die Musik an...
                    ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
                    1. Irgendwie hab ich da aber ein problem: Das funktioniert irgendwie nicht.
                      Kann mir jemand bei dem Beispiel helfe:

                      Ich habe ein Edit-Feld. In dieses können nur Zahlen eingetragen werden. Nun will ich die erste und die Dritte Zahl miteinander addieren und in einer MessageBox ausgeben. so weit verstanden ?
                      OK, wie macht man das ?

                      P.S.: das mit der MessageBox hätte ich vielleicht hinbekommen, wenn der Compiler akzeptieren würde das ich statt ein Text eine Variable von Typ int eintrage. aber der will das nicht :-(

                      Binfür jeden Tipp dankbar!

                      --
                      Wo die Sprache aufhört, fängt die Musik an...
                      ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
                      1. Hallo

                        Ich habe ein Edit-Feld. In dieses können nur Zahlen eingetragen werden. Nun will ich die erste und die Dritte Zahl miteinander addieren und in einer MessageBox ausgeben. so weit verstanden ?

                        Du meinst, wenn jemand

                        1234

                        eingibt, dann möchtest Du 1 + 3 addieren und das Ergebnis ausgeben?

                        OK, wie macht man das ?

                        Erstes (Nulltes) Zeichen der Zeichenkette nehmen, mit atoi() umwandeln,
                        drittes (zweites) Zeichen analog umwandeln (falls diese vorhanden sind :-))
                        Summe bilden.

                        P.S.: das mit der MessageBox hätte ich vielleicht hinbekommen, wenn der Compiler akzeptieren würde das ich statt ein Text eine Variable von Typ int eintrage. aber der will das nicht :-(

                        itoa() dürfte Dir bei der Umwandlung weiterhelfen.
                        Alles aus dem Gedächtnis, sowas hab' ich in C schon seit Jahren nicht mehr gemacht. C++ dürfte übrigens deutlich komfortablere Umwandlungsmethoden bieten, vermute ich. Konsultiere das Handbuch ...

                        Freundliche Grüße

                        Vinzenz

                        1. Hallo,

                          Du meinst, wenn jemand

                          1234

                          eingibt, dann möchtest Du 1 + 3 addieren und das Ergebnis ausgeben?

                          Genau das mein ich xD

                          Erstes (Nulltes) Zeichen der Zeichenkette nehmen, mit atoi() umwandeln,
                          drittes (zweites) Zeichen analog umwandeln (falls diese vorhanden sind :-))
                          Summe bilden.

                          Und genau das ist das problem: Ich weiß nicht wie ich ein Zeichen aus einer Zeichenkette lesen kann.

                          P.S.: das mit der MessageBox hätte ich vielleicht hinbekommen, wenn der Compiler akzeptieren würde das ich statt ein Text eine Variable von Typ int eintrage. aber der will das nicht :-(

                          itoa() dürfte Dir bei der Umwandlung weiterhelfen.

                          Und was bewirkt das ?

                          Alles aus dem Gedächtnis, sowas hab' ich in C schon seit Jahren nicht mehr gemacht. C++ dürfte übrigens deutlich komfortablere Umwandlungsmethoden bieten, vermute ich. Konsultiere das Handbuch ...

                          Mach ich xD

                          MfG. Christoph

                          --
                          Wo die Sprache aufhört, fängt die Musik an...
                          ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
                          1. Hallo

                            Du meinst, wenn jemand
                                1234
                            eingibt, dann möchtest Du 1 + 3 addieren und das Ergebnis ausgeben?

                            Genau das mein ich xD

                            Erstes (Nulltes) Zeichen der Zeichenkette nehmen, mit atoi() umwandeln,

                            drittes (zweites) Zeichen analog umwandeln (falls diese vorhanden sind :-))
                            Summe bilden.

                            Und genau das ist das problem: Ich weiß nicht wie ich ein Zeichen aus einer Zeichenkette lesen kann.

                            atoi():
                            _a_scii
                            _to_
                            _i_nteger

                            itoa() dürfte Dir bei der Umwandlung weiterhelfen.

                            Und was bewirkt das ?

                            itoa():
                            _i_nteger
                            _to_
                            _a_scii

                            Ach ja, sprintf() wäre in der Tat bei C besser geeignet :-)
                            Ich müsste mal mein Gedächtnis auffrischen, aber in der Praxis hab' ich C/C++ seit Jahren nicht mehr benötigt :-(

                            Freundliche Grüße

                            Vinzenz

                          2. Hi,

                            Du meinst, wenn jemand
                                1234
                            eingibt, dann möchtest Du 1 + 3 addieren und das Ergebnis ausgeben?

                            ah gut, also meinst du "Ziffern", nicht "Zahlen".

                            Und genau das ist das problem: Ich weiß nicht wie ich ein Zeichen aus einer Zeichenkette lesen kann.

                            Den Index-Operator, also die eckigen Klammern, erwähnte ich doch schon in meinem ersten Posting zum Thema.

                            P.S.: das mit der MessageBox hätte ich vielleicht hinbekommen, wenn der Compiler akzeptieren würde das ich statt ein Text eine Variable von Typ int eintrage. aber der will das nicht :-(

                            Ja, in C ist die Unterscheidung von Datentypen wichtig! Eine automatische Umwandlung zwischen Strings und numerischen Werten (wie z.B. in Javascript oder PHP) gibt's nicht. Wenn man sie will, muss man es explizit formulieren.

                            Ciao,
                             Martin

                            --
                            Finanztipp:
                            Leihen Sie sich Geld von einem Pessimisten.
                            Er rechnet sowieso nicht damit, dass er es zurückbekommt.
                        2. Hi,

                          Erstes (Nulltes) Zeichen der Zeichenkette nehmen, mit atoi() umwandeln,
                          drittes (zweites) Zeichen analog umwandeln (falls diese vorhanden sind :-))
                          Summe bilden.

                          Wenn es sich nur um einzelne Ziffern handelt kann man sie auch in Zahlen umwandeln, indem man das Zeichen '0' abzieht.

                          Beispiel:
                          char text[] = "159";
                          int zahl = 0;
                          zahl = text[2] - '0';
                          printf("zahl: %d\n",zahl);

                          mfG,
                          steckl

    2. Hallo Martin,

      int ModifyString(char *string)
      { int i;

      while (string[i]!=0)        // ein Nullbyte markiert in C das String-Ende
          { string[i] = AnotherChar; // hier Ersatzwert eintragen
            i++;                     // Index erhöhen
          }                          // und weiter
         return (0);                 // ein Dummy-Rückgabewert der Form halber
      }

      Mal abgesehen von dem Initialisierugsproblem, worauf Du schon hingewiesen wurdest: Das funktioniert nur dann, wenn der String im Speicher auch ohne Seiteneffekte modifizierbar ist. Das ist bei Strings, die man aus API-Aufrufen zurückbekommt, oftmals nicht der Fall. Gut, ich kenne die Windows-API jetzt nicht wirklich genau, kann das daher in diesem Fall nicht sagen, aber man sollte sich überlegen, ob man nicht lieber eine Kopie des Strings anlegt und die Kopie dann zurückgibt. Hängt aber wie gesagt von der konkreten Situation ab und ist nicht allgemein zu beantworten.

      Viele Grüße,
      Christian

    3. hi!

      int ModifyString(char *string)
      { while (*string)
            *string++ = AnotherChar;
         return (0);
      }

      In C++ macht man das natuerlich so:

        
      #include <string>  
        
      class replace_char : public std::unary_function<char, void> {  
        public:  
          void operator()(char &c) {  
            ++c;  
          }  
      };  
        
      int main() {  
          std::string s = "Hello World!";  
          std::for_each(s.begin(), s.end(), replace_char());  
      }  
      
      

      :D

      bye, Frank!

      --
      Never argue with an idiot. He will lower you to his level and then
      beat you with experience.