Backspace-Funktionalität
-
Hallo Gemeinde,
ich habe herausgefunden, wie ich die Backspace-Taste richtig in meinem Programm
implementiere. Allerdings stellt sich jetzt noch eine Frage. Erstmal der Code:switch( currentChar ) { case 8: //Backspace if( currentPosition > 0 ) { currentPosition--; //Merker für aktuelle Cursorposition strcpy( currentField->UserInput+currentPosition, currentField->UserInput+currentPosition+1 ); // ??? PrintField( currentField ); //Gibt den geänderten String wieder aus }
Die Zeile mit dem "strcpy" bereitet mir Kopfzerbrechen. "strcpy" ist ja im Grunde supersimpel. Kopiere den einen String in den anderen, aber so wie es oben benutzt wird verstehe ich nicht. "currentField->UserInput" = Eingabe des Benutzers z.B. "Hallo". "currentPosition" = die aktuelle Position z.B. 5. Nun meine Frage. Wie können ein String und ein Integerwert so miteinander funktionieren.
Für jedliche Hilfen wäre ich dankbar.
Gruß
naikoteki
-
currentField->UserInput+currentPosition+1
Der String ab der obigen Adresse wird in den String mit der Adresse
currentField->UserInput+currentPosition kopiert.
Dafür ist strcpy nicht vorgesehen, weil sich die Bereiche überlappen und das Ergebnis undefiniert ist.
Für überlappende Speicherbereiche ist memmove geeignet.
-
Hallo,
weil currentField->UserInput hier als Zeiger ( char* ) interpretiert wird, und dann gibt es die sogenannte Zeiger-Arithmetik, die es in C erlaubt, die Position dieses Zeiger so zu ändern, dass dieser auf ein currentPosition bzw. currentPosition+1 von der aktuellen Zeigerposition (currentField->UserInput) entferntes Zeichen zeigt (und damit auf einen "String", der ab dieser "erhöhten" Position beginnt). Analog ist übrigens das Subtrahieren erlaubt, bzw. auch die Subtraktion zweier Zeiger voneinander (um, beim Beispiel von char zu bleiben, die Anzahl der Zeichen zu finden, die zwischen diesen beiden Zeiger-Positionen liegen, zu finden). Dabei muss man natürlich aufpassen, dass nur gültige Zeiger(Positionen) verwendet werden. Der Compiler weiss, um wieviele eigentliche Bytes bei Additionen/Subtraktion verschoben werden muss, in dem er einfach die Byte-Länge des Datentyps, auf den gezeigt wird, nutzt, Zeigerarithmetik ist deshalb auch für andere Datentypen erlaubt und eindeutig "definiert".
MfG,
Probe-Nutzer
-
Oder schreibst dir die Kopierfunktion selbst:
char a[] = "Hello World"; char* b = a; while ( *b ) *b = *(b+++1); puts ( a );
-
Big Brother schrieb:
while ( *b ) *b = *(b+++1);
undefiniert mangels sequence point.
while ( *b++ ) b[-1] = *b;
-
camper schrieb:
undefiniert mangels sequence point.
wegen was? was ist das ?
-
Hallo,
es handelt sich um "Programmabarbeitungs-Punkte", an denen jeweils garantiert ist, dass alle "Seiteneffekte" (hier die Auswirkungen der Inkrementierung von b) schon eingetreten sind. In einer Zuweisung gibt es keinen sequence point, und damit entsteht "Undefiniertheit", siehe:
http://en.wikipedia.org/wiki/Sequence_point
MfG,
Probe-Nutzer
-
Ja, ok.
Hier habe ich auch noch etwas interssantes mit Beispielen zu diesem Thema gefunden:
http://www.schellong.de/c.htm#seqpGruß,
B.B.
-
Probe-Nutzer schrieb:
Der Artikel bedarf aber dringend einer Überholung.
The + operator is not a sequence point and therefore in the expression f()+g(), it is possible that either f() or g() will be executed first.
Zwar stimmen beide Teile, aber dazwischen besteht keine Implikation.
-
*(b+++1)
Was könnte hier denn schief gehen?
Ist das nicht egal, ob zuerst b++ und dann ne 1 addiert wird, oder erst ne 1 addiert und dann b inkrementiert wird ?
-
Alle Wikipedia-Artikel sollten grundsätzlich kritisch gelesen werden (das habe ich hier nicht), aber die Links, die dort angegeben werden, sind oft brauchbar (dort findet sich ein Link zu den C-FAQ, der es ganz gut beschreibt). Eigentlich müsste ich dich noch auffordern, dass du den Artikel entsprechend verbesserst, aber ich bin da selbst in Sachen Wikipedia recht wenig engagiert.
@Genauwissenwoller:
Die Zuweisung zur Variablen b, die auf der linken Seite ebenfalls auftaucht, ist das Problem, nicht der zugewiesene Ausdruck, der ist ok. Man kann einfach nicht sagen, welchen Wert b nach der Zuweisung hat
MfG,
Probe-Nutzer
-
nachdem ich von euch so viele hilfreiche Lösungsvorschläge bekommen habe, möchte ich jetzt noch einen oben draufsetzen. Das mit dem Backspace funktioniert jetzt alles schon ganz gut. Jetzt zum Problem. Was wenn ich ein Datum habe z.B. "30.11.01" und ich möchte Backspace benutzen, aber die Punkte sollen sich nicht verschieben. Anders formuliert. Ich kann das Datum genauso löschen wie alles andere bloß die Punkte sollen unverändert bleiben.
Wenn euch jetzt auch noch dafür etwas einfällt, dann bin ich wirklich wirklich wirklich beeindruckt.
MfG
naikoteki
-
muttu nen string immer wieder neu ausgeben, den du entsprechend den backspace tastenanschlägen veränderst.
-
muttu nen string immer wieder neu ausgeben, den du entsprechend den backspace tastenanschlägen veränderst.
Sorry, mein Guter, aber mit dieser Antwort kann ich so überhaupt nichts anfangen. Is scho a bissl dünn.
MfG
naikoteki
-
ich nehme an, du möchtest eine datumeingabe programmieren.
weiter nehme ich an, das datum wird zunächst als ein string eingelesen.
wenn nicht, dann sollte es das, meinen vorstellungen nach.wird backspace gedrückt, wird jeweils das letzte zeichen aus dem datumstring gelöscht und dieser string wird wieder ausgegeben.
ist das zeichen ein punkt, so wird das zeichen vor dem punkt gelöscht, der string wird ausgegeben. usw.usw.