Jump to content
Sign in to follow this  
_TT_

Input som begrenser antall tegn en kan skrive.

Recommended Posts

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?

Edited by _TT_

Share this post


Link to post

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.

Edited by lnostdal

Share this post


Link to post

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.

Edited by _TT_

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...