String mit vordefinierter Länge einlesen / eingeben
-
Hallo,
ich suche eine Funktion, die einen String von der Tastatur einliest, aber nur die Eingabe einer bestimmten Anzahl von Zeichen zulässt. Diese Anzahl an Zeichen möchte ich individuell definieren können.
Ähnlich wie die Funktion getch(), nur das die Funktion getch() die EIngabe von einem Zeichen zulässt und kein Enter erwartet. Ich möchte n Zeichen eingeben und Enter drücken, damit die Eingabe mit BACKSPACE korrigiert werden kann.
Als Entwicklungsplattform verwende ich Visual.NET 2003 (C++). Die Funktion sollte wenn möglich auch unter Linux und Mac OS funktionieren.
Vielen Dank im Vorraus für euche Vorschläge.
Tikonteroga
-
Du wirst mit getch() arbeiten müssen da es die einzige Funktion ist die auf genau *ein* Zeichen wartet. Backspace, etc. musst du einfach selbst verarbeiten, erster Ansatz:
std::string getLine (unsigned long int c) { char ch; std::string line; while((ch=getch()) != '\r' && c--) { switch(ch) { case 8: /* backspace */ break; case 27: /* escape */ break; default: cout << ch; line += ch; break; } } return line; }
MfG SideWinder
-
Vielen Dank,
ich werde mich mal mt dem Beispiel beschäftigen. Kannst du mir sagen, ob diese Funktion unter Linux, Windows und Mac OS identisch ist?
Gruß
Tikonteroga
-
Wenn getch() überall vorhanden ist, ist die Funktion überall einzusetzen. Ob getch() aber überall gleich funktioniert kann ich dir leider nicht sagen, denke aber schon.
MfG SideWinder
-
Hallo,
vielen Dank für die Hilfestellung. Ich hab mich jetzt mit der Funktion etwas beschäftigt und dabei ist ein neues Problem entstanden. Den String, den ich über die Funktion einlese muss ich einem char * pointer zuweisen. Kannst du mir dabei vielleicht noch behilflich sein, denn der Datentyp std::string ist mir unbekannt und ich hab damit noch nie gearbeitet.
Gruß
Tikonteroga
-
Mir ist noch was eingefallen. Ich könnte der Funktion ja den besagten char *Pointer übergeben, dann müsste die Funktion den String nicht zurück geben. Somit währe sie vom Datentyp void.
-
Wenn du vor hast mit C-Zeigern für Strings zu arbeiten dann bleibt dir sowieso nichts anderes übrig als den String bereits zu übergeben, da sonst in vielen Fällen der in der Funktion allokierte Speicher nicht mehr freigegeben wird (nicht nur weil der User darauf vergisst, in manchen Fällen kann er den Speicher gar nicht mehr freigeben).
Bedenke dabei aber nicht nur den char* zu übernehmen sondern auch die Länge die der User allokiert hat (sollte aber im Normalfall hoffentlich die selbe Länge wie die Maximallänge sein).
Heißt für dich:
void getLine (char* line, unsigned long int len) { ... }
Wobei len die Länge von line und zugleich die Maximallänge der einzugebenden Zeichen darstellt.
MfG SideWinder
-
Noch eine Frage zu deinem ersten Post:
Ich kann "cout" nicht nachvollziehen, was ist das? Siehe:
.
.
.
default:
cout << ch;
.
.
.Gruß
Tikonteroga
-
Hier ist mir als C++-Programmierer wieder mal ein C++-Programmelement reingehüpft:
//C++: cout << ch; //C-Pendant: printf("%c",ch);
Jetzt sollte alles klar sein
MfG SideWinder
-
SideWinder schrieb:
Heißt für dich:
void getLine (char* line, unsigned long int len) { ... }
Es geht auch mit einer statischen Variablen
char *getLine (unsigned long len) { static char s[SIZE]; if (len < SIZE) { // Hier zeichen einlesen return s; } return 0; }
-
Schonmal:
delete[] getLine(10);
aufgerufen *g*
MfG SideWinder
-
Hier noch ein kleiner Ansatz, vielleicht etwas umständlich...aber funktioniert...und Backspace auch ;))
while ((cZeichen != 13)) //solange wie nicht ENTER gedrückt wird { cZeichen = getch(); //Ein Zeichen einlesen if ((iZeichenzahl < 9) && //Prüfung ob schon mehr als 9 Zeichen getippt (((cZeichen>=48) && (cZeichen <= 57)) || (cZeichen == 8))) //Prüfung ob Zeichen eine Ziffer (ASCII) { if ((cZeichen == 8) && (iZeichenzahl > 0)) { cEingabestring[iZeichenzahl-1] = '\0'; iZeichenzahl--; printf("\r "); cout<<"\r"<<cEingabestring; } else { strcat(cEingabestring, &cZeichen); //Das Zeichen an den String anhängen printf("\r%s",cEingabestring); iZeichenzahl++; //Anzahl Zeichen erhöhen } }
Gruß
-
Wenn du schon char* verwendest, dann aber bitte einzelne Zeichen nicht mit strcat() anhängen.
MfG SideWinder