Gå til innhold

Input som begrenser antall tegn en kan skrive.


Anbefalte innlegg

Da eg ikke klarte å finne ut hvordan man kan begrense antall tegn som kan skrives inn av brukeren i en input-operasjon, prøvde eg meg på å lage en egen en:

 

#include <iostream>
#include <conio.h>
#include <string>

using namespace std;

string getInput( int numChars );

int main( int argc, char* argv[] )
{
string input( getInput( 40 ) );
cout << "Input: " << input;

return 0;
}

string getInput( int numChars )
{
//Variable to store the input in.
char userInput[256];

//Store the startposition of the input.
unsigned char org_xPos = wherex();
unsigned char org_yPos = wherey();

//Temporary variables for the loop.
int tempChar = 0;
int numCharsTyped = 0;

//Loop while waiting for user to give input.
bool loop = true;
while( loop )
{
 //Check for keystrokes.
 if ( kbhit() )
 {
 	//Get which key is pressed.
 	tempChar = getch();

 	//If the key is <ENTER> button.
 	if( tempChar == 13 )
 	{
   loop = false;
 	}
 	//If the key is <BACKSPACE> button.
 	else if( (tempChar == 8) && (numCharsTyped > 0) )
 	{
   //Find out where to reposition the cursor.
   int whereTo = ( (int)org_xPos + numCharsTyped ) - 1;

   //Reposition the cursor and remove the last character printed.
   gotoxy( whereTo, org_yPos );
   cout << " " << endl;
   gotoxy( whereTo, org_yPos );

   //Reduce numCharsTyped and delete last character from the temporary input variable.
   numCharsTyped--;
   userInput[numCharsTyped] = NULL;
 	}
 	//If the key is any other button.
 	else if( (numCharsTyped < numChars) && (tempChar != 8) )
 	{
   //Allow only 0-9 , a-z , A-Z, !, ?, . and whitespace.
   if( ( (97 <= tempChar) && (tempChar <= 122) ) || ( (48 <= tempChar) && (tempChar <= 57) ) || ( (65 <= tempChar) && (tempChar <= 90) ) || (tempChar == 33) || (tempChar == 63) || (tempChar == 46) || (tempChar == 32) )
   {
   	//Find out where reposition the cursor after print.
   	int whereTo = ( (int)org_xPos + numCharsTyped ) + 1;

   	//Print the key pressed, and reposition the cursor at its end.
   	cout << (char)tempChar << endl;
   	gotoxy( whereTo, org_yPos );

   	//Add the character to the temporary input variable, and increase numCharsTyped.
   	userInput[numCharsTyped] = (char)tempChar;
   	numCharsTyped++;
   }
 	}
 }
}

//Add null-termination at the end of the input variable string.
userInput[numCharsTyped+1] = '\0';

//Return the input.
return (string)userInput;
}

 

Siden eg er en nybegynner er det sikkert mer av nok i koden som skulle helst bli gjort annerledes, men den fungerer tilsynelatende helt fint. (Kompilert med DJGPP.)

 

En av tingene eg ville fortetrukket var å bruke string hele veien, uten å måtte hoppe over til char[256] i selve input funksjonen, men hvis eg legger til en string variabel i funksjonen returnerer getch() helt feil tegn av en eller annen grunn. Fjerner eg string variabelen igjen, går det tilbake til normalt.

Noen som forstår seg på hvorfor dette skjer?

 

En annen ting eg lurte på var conio.h funksjonene som eg bruker; wherex(), wherey() og gotoxy(), som eg finner tilgjengelig i DJGPP, men ikke i Visual C++. Misforstår eg, eller er det rett at disse funksjonene er gamle og avleggs? Finnes det noe nyere og bedre alternativer?

Endret av _TT_
Lenke til kommentar
Videoannonse
Annonse

noe slikt:

...
int temp_char = getch();
string str;
str.append(1, (char)temp_char);
...

 

conio er ikke en standard header, altså den er ikke en del av standard C/C++ men noe Borland la til for lengesiden. I dag er ncurses ( http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/ ) - som inneholder en `getch'-funksjon - mye brukt under Linux/*nix, og på Windows må man ta i bruk Win32-spesifik funksjonalitet.

Endret av lnostdal
Lenke til kommentar

Takk for svar angående conio. Eg prøver kode til rent dos, så eg får vel holde meg til det eg bruker no.

 

Angående bruk av string i funksjonen så var eg kanskje litt dårlig å forklare. Saken er den at eg ikkje bruker stringen engang, eg bare declare'er den, som så;

 

string str;

 

inne i getInput(), og allt annet untouched. Og getch() begynner å returnere feil verdier.

Fjerner eg declaration'en, så fungerer det fint igjen.

Endret av _TT_
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...