C++ - Problem *Hilfe*
minicrispie
- programmiertechnik
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 !
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
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
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
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
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
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
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.
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
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!
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...
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!
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
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
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
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
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
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
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!