C / C++ Eingabe begrenzen?

Ja ich bins schon wieder :D

Ich wollte fragen, ob es eine Möglichkeit gibt, die Zeichen, die der Benutzer bei einer Eingabeaufforderung eingeben kann begrenzen kann?
 
wenn du das so meinst, dass der Benutzer einfach nicht weiter tippen kann, glaube ich nicht dass das geht, wäre mit zumindest nicht bekannt.

Ansonsten kannst du den eingelesenen String ja entrsprechend abschneiden bzw die Eingabe zwischenspeichern und nur die Zeichenanzahl die du willst in den weiterzuverarbeitenden String kopieren.
 
Es kann sein, dass das geht, wenn ja wäre ich dir dankbar, wenn du es mal probieren und ein funktionierendes Beispiel posten könntest.
Ich habs mal schnell versucht, aber es hat nicht so funktioniert, wie ich mir das vorgestellt habe.
 
Moin,

mit fgetc() kannst du das schlicht und ergreifend vergessen, da du erst die Kontrolle bekommst, wenn der Anwender Enter drückt.

Dann kannst du zwar den String durchparsen und Zeichen rausschmeißen, auf dem Bildschirm sind sie aber trotzdem zu sehen.

Wenn du auf deinem System curses oder ncurses installiert hast, kannst du es damit machen. Da kannst du jeden Tastendruck abprüfen und ggf. eine Fehlermeldung oder einen Piep ausgeben.
 
arr, natürlich, sorry hab mist gelabert. aber wenn man nen istream direkt abfragt? so istream.get()?
ka ich probiers mal...

edit: bekom ich nit hin, sprich es wird nit kompileirt.. naja ncurses is ja auch ne option
 
wie wärs mit einer einfachen for schleife... in etwa so:

Code:
for(i=0;i<=200;i++)
{
	while(!kbhit());
	string[i]=getch();
	printf("%c",string[i]);
	if(string[i]==13)                //13 is glaub ich der ascii für return
	{
		break;
	}
}

musst halt noch irgendeine warnung einfügen falls die zeichen erreicht sind...


sagts mir falls das blödsinn is

mfg CusHi
 
Hi,

ja, mit getch() ist schon mal eine feine Sache. Allerdings kann man das auch etwas eleganter über pointer machen.

Es gibt eine BIOS-Eingabefunktion, die man per Interrupt aufrufen kann. So macht es das Bios nämlich auch. Das Problem hierbei ist, dass der String nicht per \0 abgeschlossen wird, sondern mit $.
Beim Aufrug mus man nur noch in ein Proziregister die Länge übergeben (AX ???) und der Computer beept nur noch, wenn man mehr eingeben will.

Gruß
Elmar
 
@CusHi0n: Keine schlecht Idee mit getch().
Aber du musst den array erst vorher definieren.

mein Vorschlag fuer c++

Code:
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;

int main()
{
	string enter[10]; // Vector erst definieren

	
	{
		for(int len=0;len<=5 && kbhit()!=0 && getch()!='\n';++len)  //max. 5 Zeichen einlesen
		{
			enter[len]=getch();
		}

	}

	return 0;
}

Das Problem ist............. es funktioniert leider ueberhaupt nicht.
Aber ich finde es sieht so richtig aus.
Jemand ne Idee, was falsch ist?

mfg

Raptor
 
Hi,

len<=5 && kbhit()!=0 && getch()!='\n'

Sollange len kleiner oder gleich 5 ist UND keine Taste gedrückt ist UND die jetzt zu drückende Taste nicht '\n' ist

Ist genau so Lustig, wie der "Treffen sich zwei Tokens auf dem Ring" Witz :D Nicht böse sein, Spaß muss ja sein :)

len<=5 && enter[len]!=13

sollte das wohl heißen.

Ich mache das lieber per

do
{
...
}while(len<6&&enter[len++]!=13);

Aber ansonnsten schon mal ganz gut. Die do-while-Schleife ersetzt die For-Schleife völlig, läuft aber einen Ticken schneller, da eine For-Schleife nicht mit so simplen Assemblerinstruktionen abgebildet werden kann.

Es geht aber auch per Pointer.

char enter[10];
char *point = enter;

Dann kann man bequem
if(*pointer==13)
fragen

Um den Pointer weiterrücken zu lassen braucht man nur
pointer++;
zu sagen.


Wie dem auch sei, muss der String mit einer echten Null abgeschlossen werden, z.B. per
eingabe[len+1]=0;

sonnst ist der String nicht unbedingt abgeschlossen. beim ersten Lauf geht es noch oft überraschenderweise gut, beim 2. Lauf meist nicht, weil der Speicher ja jetzt Müll enthält.

Gruß
Elmar
 
@ES: Jetzt kommt mal meine Interpretation von
"for(int len=0;len<=5 && kbhit()!=0 && getch()!='\n';++len)"
solange len kleiner als 6 ist UND eine Taste gedrueckt wurde UND nicht Return gedrueckt wurde wird die Schleife ausgefuehrt.

Du hast mein "kbhit()!=0" missverstanden.
Jetzt mal in Computerdeutsch.
[Computerdeutsch]

kbhit() -> Taste
!= -> ungleich
0 ->negativ -> nicht war.

Zusammengefasst: Solange die gedrueckte Taste ungleich keine Eingabe ist, fuehre die Schleife aus.
[/Computerdeutsch]

Also meine Konstruktion ist durchaus richtig, oder steh ich jetzt voellig auf'm Schlauch?

mfg

Raptor
 
Hi,

mit kbhit() gebe ich Dir recht.
Aber auf !=0 fragt man nicht ab. das !=0 kann man weglassen, die Bedingung kbhit() ist von Haus aus true, wennn sie nicht 0 ist. Hat mich jetzt etwas verwiirt, da man so was nicht macht.

getch() wartet aber so lange, bis Du eine Taste gedrückt hast. Das heißt, die Schleifenbedingung wartet, bis Du was drückst und schmeisst das Ergebnis sofort über bord, da getch() den Tastaturpuffer wieder löscht.

Durch diese Konstruktion der Schleife musst Du ständig eine Taste drücken, sonnst ist die Schleife beendet, also irgendwie unbrauchbar. Außerdem musst Du alles 2x drücken ohne Pause, sonnst wird die Schleife beendet.

In der Schleife darfst Du nicht prüfen, ob was gedrückt wird, sondern nur, ob die letzte Eingabe nicht return war. Man muss dem Anwender ja zeit geben, dass er was eingibt. Mehr 1000000 Anschläge pro Minute schafft kein Mensch, und dann auch noch alles zwei mal eingeben. Das ist der Fehler.

Gruß
Elmar
 
OK, ich habs jetzt noch anders.
Ist aber in C und nicht C++
Code:
char text[11], z; 
char pwz = '*'; //Zeichen für Passwörter 
int i, max=10; 
 
for(i=0;i<max;) //Lese solange Zeichen ein bis 10 Zeichen gelesen wurden 
{ 
   z = getch(); 
 
   switch(z) //wurde was spezielles gedrückt? 
   { 
      case 0: //Sondertasten wie z. B. Pfeil nach oben 
         if(kbhit()) //bei Sondertasten werden zwei Werte eingelesen! 
            getch(); //Wert der Sondertaste lesen 
         break; 
      case 8: //Rücktaste (Zeichen links vom Cursor löschen) 
         if(i>0) 
         { 
            printf("\x8 \x8"); //Zeichen am Bildschirm löschen 
            text[i-1] = 0; //letztes Zeichen löschen 
            --i; 
         } 
         break; 
      default: //restliche Zeichen 
         if(z>=' ') //keine Steuerzeichen! 
         { 
            printf("%c", (pwz)?pwz:z); //Zeichen ausgeben; wenn pwz 0 dann eingegebenes Zeichen 
            text[i++] = z; 
         } 
         break; 
   } 
} 
text[i] = 0; //Stringendekennzeichen nicht vergessen! ;)
thx an AJ

mfg

Raptor
 
Original von Nornagest
wenn du das so meinst, dass der Benutzer einfach nicht weiter tippen kann, glaube ich nicht dass das geht, wäre mit zumindest nicht bekannt.

Ansonsten kannst du den eingelesenen String ja entrsprechend abschneiden bzw die Eingabe zwischenspeichern und nur die Zeichenanzahl die du willst in den weiterzuverarbeitenden String kopieren.

Allso wenn du nicht genau programmieren kannst spar dir deine bemerkungen den das geht.
 
Hi,

Saubere Sache. Sogar an die Backspacetaste wurde gedacht. Auch wurden Tasten abgefangen, die sonst eine unerwünschten Stringabschluß einbringen würden.

Gruß
Elmar
 
Zurück
Oben