# C/C++ Practice Questions on User Input Problem 16

## This is my series on C/C++ problems for accepting user input in a robust way. The questions of this series start from C programs, and they slowly build and convert to classes, and which further build into inheritance. This is Problem 16 of this series.

Last Reviewed and Updated on February 7, 2020

## User Input - Problem 16

Use the class CConsoleULong that you created in Problem 13 to input a number. Output the Fibonacci number at that serial. The user input should be in the range 0 < i < 16.

For example, we know the Fibonacci series is 1, 1, 2, 3, 5, 8 ... if the user enters 4, the output should be the 4-th Fibonacci number, ie, it should be 3. if he enters 5, the output should be 5, and so on. If the user enters a number outside the range, then he should be asked to re-enter. NOTE: The class CConsoleULong has a built-in functionality to validate that the user enters an unsigned long.

Solution
```// include all the headers
#include "conio.h"
#include "limits.h"
#include "errno.h"
#include
<iostream>

class CConsoleBase
{

public:
// the maximum limit allowed, use a static const
// initialize here itself
static const int iMAXCHARS = 12;

protected:
char m_cBuff [iMAXCHARS + 3 +
/*take two more so that overflow can be detected*/2];

char* m_cReturn;

// add a temporary storage to hold a copy of input string
// while the cleanup takes place
char m_cTemp [iMAXCHARS + 3 +
/*take two more so that overflow can be detected*/2];

// the length of string entered by the user.
// this length is required during cleanup when
// we flush the unwanted characters. so we make it
// a private member
int m_iInputLength;

public:
// constructor
CConsoleBase ()
{

// requirement for _cgets
m_cBuff  = (iMAXCHARS + 2) + 1;

}

protected:
// returns success if the user enters a string <= 10 chars
{

m_cReturn = NULL;

int iLoopCtr = 0;

m_cReturn = _cgets (m_cBuff);

// save length in a variable. Why are we saving it ?
m_iInputLength = strlen (m_cReturn);

// save console input on the temp for cleanup
strcpy (this->m_cTemp, this->m_cReturn);

// Robust programming -
// remove unwanted, unread characters from the stream
do
{

m_cReturn = _cgets (m_cBuff);

}while (0 != m_cReturn );

// now write back to m_cReturn, the value of m_cTemp
strcpy (this->m_cReturn, this->m_cTemp);

return (m_iInputLength <= iMAXCHARS);

}

};

class CConsoleULong : public CConsoleBase
{

unsigned long m_iIntValue;

public:
inline bool TakeIntInput ()
{

if (bRet)
{

// validate
// if the user has not entered a proper string
// we should say it is an error, we are
// taking the length = 10 but for 64-bit
// systems this won't work because
// INT_MAX could be longer
if ((('+' == m_cReturn )
&&
11 < m_iInputLength)
||
(10 < m_iInputLength)
||
(0 == m_iInputLength)
||
('-' == m_cReturn )
)
{

bRet = false;

}

// now check each digit, do checking
// so long as iRet != -1
for (
int iLoopCtr = 0;

iLoopCtr < m_iInputLength && bRet;

iLoopCtr++
)
{

// if the user enters a sign,
// we should ignore it in our
// validation. our purpose is
// to check for valid numbers
if (('-' == m_cReturn )
||
('+' == m_cReturn ))
continue;

if (!isdigit (m_cReturn [iLoopCtr]))
{

bRet = false;

}

}

if (bRet)
{

// now verify if the number is
// within the range. the range
// as you can see is ULONG_MAX. so
char* end;

m_iIntValue =
strtoul (m_cReturn, &end, 10);

// atoi sets errno to ERANGE if
// out of range occurs the header
// errno.h is include
// at the top for this
if (ERANGE == errno)
{

bRet = false;

_set_errno (0);

}

}

}

return bRet;

}

inline unsigned long DisplayIntInput ()
{

return this->m_iIntValue;

}

};

unsigned int fibonacci (unsigned int i)
{

switch (i)
{

case 1:
return 0;

case 2:
return 1;

default:
return fibonacci (i - 1) + fibonacci (i - 2);

}

}

int main ()
{

unsigned int i;

CConsoleULong obj;

//NOTE: The class CConsoleULong has a built-in functionality to
// validate that the user enters an unsigned long.
do
{

std::cout << "Which fibonacci number do you want[1-15]: ";

}while (!obj.TakeIntInput ()

||
(((i = obj.DisplayIntInput ()) > 15)
|| (0 == i)));

printf ("The %u-th fibonacci number is = %u\n", i, fibonacci (i));

return 0;

}

```

## My C/C++ Videos on Youtube

Here is the complete playlist for video lectures and tutorials for the absolute beginners. The language has been kept simple so that anybody can easily understand them. I have avoided complex jargon in these videos. 