Amiga.org
Operating System Specific Discussions => Amiga OS => Amiga OS -- Development => Topic started by: jonssonj on November 08, 2005, 12:51:05 PM
-
Hello!
I wonder how I can check that a input made by a user, really is an integer and not anything else.
F.eg.
#include
using namespace std;
int main(void)
{
int test;
cout << "Enter integer: ";
cin >> test;
// Now I want to check that the user really entered an
// integer and not anything else.
}
BR
Jörgen Jönsson
-
I'm not a C/C++ expert, but the simplest way to do it would be to take the input in a character string and parse each character if it's a value between 0-9. Then you can convert it into a integer variable.
-
Why do you want to check that anyways?
-
The easiest way is by making use of sscanf(). Assuming you have the user input in an array of char buf with its starting tabs, spaces and letter symbols removed, you can simply call on
retval=sscanf(buf, "%d", &intval);
If retval equals 1, you have bagged an integer, the value of which is in intval. The downside is that it breaks down when faced with input which exceed the capacity of int, and ignores any remaining text in the input line after a non-number symbol was parsed. Also, sscanf() will not tell you what the user input was when it returns 0 indicating no match was made. In this case, your best bet is to simply put out a 0x07-character (\b if memory serves me) for the terminal beep, warn the user with a text, and redo the input.
-
Rusty C programmer here, but
try http://man.he.net/man3/atoi
or http://man.he.net/man3/strtol
-
You may want to consider joining this group ...
Amiga_BCG@yahoogroups.com
The guy running it is very good and responds
to all questions
-
If you want properly validated input you generally need to do it yourself. There are lots of examples of char by char input through stdio.
-
Karlos wrote:
If you want properly validated input you generally need to do it yourself. There are lots of examples of char by char input through stdio.
That's why Java is so much better :-)
/me runs away from Karlos
-
@uncharted
Or a library with validated input routines provided ;-)
-
jonssonj wrote:
Hello!
I wonder how I can check that a input made by a user, really is an integer and not anything else.
int main(void)
{
int test;
cout << "Enter integer: ";
cin >> test;
// Now I want to check that the user really entered an
// integer and not anything else.
Add this:
if(cin.fail())
{
// a number wasn't entered
}
else
{
if(!cin.eof())
{
// there is more non-numeric input
}
}
}
-
Hello all!
I use two functions that solves the problem I had.
One from MSDN that clears the cin buffer and one function that I wrote myself, that checks if the input is an integer or not.
int main(void)
{
char *buffer = 0;
buffer = new char[11];
int x=0;
int nState=0;
bool inmatning = true;
while(inmatning)
{
// ................
// other code goes here
// ...................
// I only saves 9 numbers so the biggest
// number a user can enter is 999999999.
cin.getline(buffer,10);
nState = ClearError(cin);
if(CheckForInteger(buffer))
{
x=atoi(buffer);
if (x>=0)
{
//.................
// other code goes here..
//..................
} else
inmatning=false;
} else
cout << "\nWrong input!";
}
}
// Function from MSDN
int ClearError(istream& isIn) // Clears istream object
{
streambuf* sbpThis;
char szTempBuf[20];
int nCount, nRet = isIn.rdstate();
if (nRet) // Any errors?
{
isIn.clear(); // Clear error flags
sbpThis = isIn.rdbuf(); // Get streambuf pointer
nCount = sbpThis->in_avail(); // Number of characters in buffer
while (nCount) // Extract them to szTempBuf
{
if (nCount > 20)
{
sbpThis->sgetn(szTempBuf, 20);
nCount -= 20;
}
else
{
sbpThis->sgetn(szTempBuf, nCount);
nCount = 0;
}
}
}
return nRet;
}
// Function that checks if it's an integer or not.
bool CheckForInteger(char *input)
{
// int max = 2147483647;
// Initialize some variables.
bool heltal = true;
int length = 0;
// continue until the last char.
while(*input !='\0')
{
// if we find a '-' sign at the first pos.
// we ignore it.
if ( !(*input=='-' && length==0) )
{
// check if the current char is a
// digit.
if (!isdigit(*input))
{
// if not, we set the returnvalue to false.
heltal = false;
}
}
// go to next char and count allt the chars.
input++; length++;
}
// go back to first char in buffer.
input = input - length;
// return result.
return heltal;
}
Thanks for all your help and thanks for a great forum and a great community.
BR
Jörgen Jönsson
===========================================
Now I only owns one A500. I will buy a A-One when a new
model reaches the market (I'm optimistic :) )