Schreiben Sie eine Schleife, in der Indexwerte eingelesen und die entsprechenden Feldelemente ausgegeben werden



  • Wenn etwas eingegeben wird aus dem kein Integer extrahiert werden kann geht der stream in einen Fehlerzustand und gibt konvertiert zu bool false:

    #include <limits>   // std::numeric_limits<>
    #include <cstddef>  // std::size_t
    #include <cctype>   // std::tolower()
    #include <numeric>  // std::iota()
    #include <array>
    #include <iostream>
    
    std::istream& eat_whitespace_except_newline(std::istream &is)
    {
    	for (int ch; std::isspace(ch = is.peek()) && ch != '\n'; is.get());
    	return is;
    }
    
    std::istream& ignore_line(std::istream &is)
    {
    	return is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    
    std::istream& clear_and_ignore_line(std::istream &is)
    {
    	is.clear();
    	return ignore_line(is);
    }
    
    int main()
    {
    	std::array<int, 8> foo;
    	std::iota(foo.begin(), foo.end(), 42);
    
    	for (char again{ 'y' }; again == 'y'; std::cout.put('\n')) {
    		std::size_t index;
    		while (std::cout << "Index: ",
    		       !(std::cin >> index >> eat_whitespace_except_newline) || index >= foo.size() || std::cin.peek() != '\n')
    		{
    			std::cout << "Input error :(\n\n";
    			clear_and_ignore_line(std::cin);
    		}
    	
    		std::cout << "foo[" << index << "]: " << foo[index] << '\n';
    
    		while (std::cout << "\nAgain? (y/n)\n",
    		       !(std::cin >> again >> eat_whitespace_except_newline) || (again = std::tolower(again)) != 'y' && again != 'n' || std::cin.peek() != '\n')
    		{
    			std::cout << "Input error :(\n\n";
    			clear_and_ignore_line(std::cin);
    		}
    	}
    }
    

Anmelden zum Antworten