Sign in to follow this  

problems restricting user input with SDL?

This topic is 4719 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

hi, im working on an online 2d RPG, and im tweaking the raw user input. the input im talking about here is when you type in your login name and password, etc. to do this, it looks something like this:
  switch( event.type )
  {
		case SDL_KEYDOWN:
		{
			//get the key state
			skey =  event.key.keysym.sym;

			if ((event.key.keysym.unicode & 0xFF80) == 0)  //if its a unicode message
			{

			ch = event.key.keysym.unicode & 0x7F;     //grab the character
			}
		}
  }   





now, the problem is, here tabs, enters, and other strange characters will all work, and fill my string with these values. i want to restrict it so only numbers and letters will work. so, i tried doing this:
			if ((event.key.keysym.unicode & 0xFF80) == 0)  //if its a unicode message
			{
				//if this char is a letter or a number
				if((event.key.keysym.unicode >= 48 && event.key.keysym.unicode <= 57 && event.key.keysym.unicode >=65 && event.key.keysym.unicode <=90 && event.key.keysym.unicode >=97 && event.key.keysym.unicode <=122) )
				{
					ch = event.key.keysym.unicode & 0x7F;     //grab the character
				}
			}





i *think* this is what im suppoed to do. i stepped through the code and the event.key.keysym.unicode value is indeed the value im thinking it is (it is mapped to an ASCII value). however, doing this method, i can type any key and none of it is accepted... now, i also tried doing this:
if ((event.key.keysym.unicode & 0xFF80) == 0)  //if its a unicode message
{

	ch = event.key.keysym.unicode & 0x7F;     //grab the character
	
	//if this char isnt a letter or a number, make it 0
	if(!(ch >= 48 && ch <= 57 && ch >=65 && ch <=90 && ch >=97 && ch <=122) )
	{
            ch = 0;
	}
}





but, this does the same thing. no input is accepted. does anyone know what im doing wrong? thanks for any help.

Share this post


Link to post
Share on other sites
Ok your problem is the conditional expression:


if(!(ch >= 48 && ch <= 57 && ch >=65 && ch <=90 && ch >=97 && ch <=122) )


If ch == 65 (A), let us evaluate this


ch >= 48 && ch <= 57 && ch >=65 && ch <=90 && ch >=97 && ch <=122
1 && 0 && 1 && 1 && 0 && 1 = 0


Since you ! that result, it is true. That is why it does not work. You will need to use parenthesis and a different method.


if( !((ch >= 48 && ch <= 57) || (ch >=65 && ch <=90) || (ch >=97 && ch <=122) ) )


I think that should work. But I have not tested it. At least you can see why yours does not currently work.

- Drew

Share this post


Link to post
Share on other sites
the <cctype> header has a few functions for charactor testing that *might* be useful. see here.

I'm not sure if it's unicode or SDL friendly, but it's what came to my mind. I mention it because your char testing is an "inneficient construct" according to Stroustrup's "The C++ Programming Language", where he then recommends these functions (above).

Share this post


Link to post
Share on other sites
hey guys,

wow, i feel stupid. i cant believe i didnt realize the logic i was trying to do there. obviously i should have done it the way Drew was suggesting.

im using that isalnum() function instead of doing it myself though, and it seems to be working.

thanks.

Share this post


Link to post
Share on other sites
btw,

slightly OT, but. in the SDL docs, it says EnableUNICODE() has some slight over-head. should i be enabling it before taking input, and disabling it after i poll for input (each frame)? or, should i just enable it one time in the begining of the program? im not sure which is faster.

Share this post


Link to post
Share on other sites
Quote:
Original post by graveyard filla
im using that isalnum() function instead of doing it myself though, and it seems to be working.


Great decision! I personally use those functions as well - for they get it done quick and easy.

Quote:
Original post by graveyard filla
btw,

slightly OT, but. in the SDL docs, it says EnableUNICODE() has some slight over-head. should i be enabling it before taking input, and disabling it after i poll for input (each frame)? or, should i just enable it one time in the begining of the program? im not sure which is faster.


You should just have to call it once to enable UNICODE and be done with. IMHO, do not worry about the overhead that was mentioned. I trust in the skills of the creator of SDL [wink]. But there is no point in enabling it, then disabling it every frame - which would be slower, since it is only an input state. The SDL docs for this function do not say much, but it does say, "Note that only key press events will be translated, not release events."

- Drew

Share this post


Link to post
Share on other sites
When i first got into programming i started with perl. There are some really tricky things you can do to hose other people's computers with poorly written perl programs installed on them. One thing is to get the other computer to execute code that was *supposed* to be a name, password, email address, etc. typed into a textbox. Since then, i've been kinda strict about what goes into a textbox and what doesn't. I'v been perfectly happy with JustAlphaOrYouDie() as character options.

of course, i *hope* you've already figured out you could do:

if ( is_alpha(c) || c == '@' )

Share this post


Link to post
Share on other sites

This topic is 4719 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this