0
How do you validate input value is correct type?
say you prompt user to input a number, but by a slip of a hand they hit a letter and hit enter. Usually a error would occur because it tries to pass the letter as a number. How does one validate the value before converting it. in C# it'd be imputed to string then Parse.int32(string). How would this translate? EDIT: It doesn't neccesarily give an answer, but if you have 4 cin functions for int values, and you input a letter, it skips the other cin functions and continues. If you cout the variable that you put the ltter in, the value is zero.
8 Réponses
+ 2
You could take the input as a string and process that, or this could do it:
int x;
std::cout << "Enter an integer: ";
while(!(std::cin >> x)){
std::cout << "I said an integer!!" << std::endl;
std::cin.clear();
std::cin.ignore(1000000, '\n'); //or some other high number
}
You can also use this to limit the input for example
int x;
std::cout << "Enter an integer below 4: ";
while(!(std::cin >> x) || x >= 4){
std::cout << "..." << std::endl;
}
cin sets an error flag when it gets bad input
clear erases that flag
and ignore just ignores anything else remaining in the stream
0
I think you are refering to exceptions in c#. But I can't answer you if you are asking about c++
Try looking up exceptions maybe that helps ._.
0
Ah @Dennis, we meet again! Thanks again for your help! Would you mind explaining to me the ignore() function a bit more, your brief explanation isn't helpful to better understanding it.
0
The first parameter says how many characters you want to ignore
Lets pick 1
The user enters: abcd
1 character gets ignored and deleted from the stream, thus a gets ignored.
bcd is now remaining in the stream
now the while loop goes back and attempts to read from the stream, bcd, which again causes an error.
Thats why you use a high number.
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
would be even better
The second parameter tells the function to stop when this character is reached.
Since '\n' means newline and cin reads until a newline you are clearing the entire stream.
0
That clears all but one question, the use of your std::
I know I dont have to since I use namespace std, but why do you insist on it @Dennis? Is there a drawback/advantage to using namespace/using std::?
0
Consider the following code:
#include <iostream>
#include <vector>
#include <algorithm>
namespace foo{
template<typename Iter>
void sort(Iter begin, Iter end){/*Some sorting algorithm*/};
}
using namespace std;
using namespace foo;
int main()
{
std::vector<int> n{3,5,1};
sort(n.begin(), n.end()); //Ambiguous, call the sort in foo or the one in std?
foo::sort(n.begin(), n.end()); //No problem, the sort of the foo namespace is called
for(auto &i: n)
std::cout << i << " ";
}
Global using namespace's are bad.
They are okay to use in small projects and stuff.
I also like the look of std:: way more than without.
0
Thanks, I've quite a lot from you, and I just met you @Dennis. I followed you and will come in with questions occasionally if that's okay.
0
Sure, I don't mind ^^