Home > Software engineering >  how can i use (!(cin>>a)) twice times?
how can i use (!(cin>>a)) twice times?

Time:10-21

enter image description here i have used code ( if (!(cin >> arr[i])) ) to check if input from user is different with type int (like string, char) to stop reading into array (arr1), and then i can't use it twice with the second array (arr2), it didn't read input and go straight to cin.clear and return... Can you help me? Thank you very much from it^^ enter image description here

CodePudding user response:

It seems you mean the following

#include <limits>

//...

if ( not ( std::cin >> arr[i] ) )
{
    //...
    std::cin.clear();
    std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
}

CodePudding user response:

Below is the complete working example in 2 ways. The program given read as many integers as the user enters on the console. For example the user can enter 30 or 300 inputs some which may be integer types and other may be of some other types like string. The array/vector will add only integer type input inside itself as you require.

Solution 1: Using built in array

#include <iostream>
#include <sstream>
#include <string>
int main()
{
    
    std::string line;
   //in case of using array, size must be fixed and predetermined 
   int arr[4] = {0}; //all elements are initialzed to zero. Also you can choose array size according to your needs
    
        int i = 0;//this variable will be used to add element into the array
        int count = 0;
        getline(std::cin, line);      
        
            
        std::istringstream s(line);
            
        //take input(from s to i) and then checks stream's eof flag status
        while(s >> i || !s.eof()) {
            //check if either failbit or badbit is set
            if(s.fail()) 
            {
                //clear the error state to allow further operations on s
                s.clear();
                std::string temp;
                s >> temp;
                continue;
             }
            else 
            {
                arr[count] = i;
                  count;
                if(count>=4)
                {
                    break;//break the loop so that you don't go beyond array size
                }
            }      
        
    }

    
  
    //print out the elements of the array
    for(int i: arr)
    {
        std::cout<<"elem: "<<i<<std::endl;
    }
   
    return 0;
}

Solution 1 can be checked here.

Solution 2: Using std::vector

#include <iostream>
#include <vector>
#include <sstream>
#include <string>
int main()
{
    
    std::string line;
   
    std::vector<int> vec;
    
    int i = 0;//this variable will be used to add element into the array
    
    getline(std::cin, line);      
    
        
    std::istringstream s(line);
        
    //take input(from s to i) and then checks stream's eof flag status
    while(s >> i || !s.eof()) 
    {
        //check if either failbit or badbit is set
        if(s.fail()) 
        {
            //clear the error state to allow further operations on s
            s.clear();
            std::string temp;
            s >> temp;
            continue;
         }
        else 
        {
            vec.push_back(i);
           
        }      
    
    }


  
    //print out the elements of the array
    for(int i: vec)
    {
        std::cout<<"elem: "<<i<<std::endl;
    }
   
    return 0;
}

Solution 2 can be checked here.

Important Note

The advantage of using std::vector over built in array(in this case) is that you don't have know the size of the vector beforehand. That is std::vector's size is not fixed as opposed to built in arrays. So it is preferable because you don't know how many input the user is going to enter. std::vector can handle this accordingly and add only valid(integer type) input. But when using built in arrays you must know/specify the size of the array beforehand. This in turn means you must know beforehand how many integers the user is going to enter, which is not practical.

  • Related