Citirea mai multor numere întregi în aceeași linie cu cin în C++ (Programare, C++, Intrare, Cin)

Juventino a intrebat.

Am o problemă în a citi numere întregi de la utilizator. Aș putea folosi

int a, b, c;
cin >> a >> b >> c;

Dar nu știu câte numere întregi va introduce utilizatorul. Am încercat acest lucru:

    int n;
    cin >> n; //Number of numbers
    int arrayNumbers[n];

    for(int i=0;i<n;i++){
    cin>>arrayNumbers[i]
    }

Iar introducerea utilizatorului va fi de genul:1 2 2 3Vreau să spun, în aceeași linie. Folosind codul meu anterior, acesta obține doar primul număr și nu și restul.

Cum aș putea să o fac?

Comentarii

  • Sunteți familiarizat cu std::vector? –  > Por Karl Knechtel.
  • Uită-te în sus getline, istringstream, și vector. –  > Por molbdnilo.
2 răspunsuri
Hikmat Farhat

Folosiți std::getline() pentru a citi mai întâi întreaga linie într-un șir de caractere. Apoi creați un stringstream din șirul de intrare. În cele din urmă, utilizați un istream_iterator pentru a itera peste token-urile individuale. Rețineți că această metodă va eșua la prima intrare care nu este un număr întreg. De exemplu, dacă se utilizează inputs: ” 1 2 ab 3″, atunci vectorul dvs. va conține {1,2}.

int main() {
        std::string str;
        //read whole line into str
        std::getline(std::cin, str);
        std::stringstream ss(str);
        //create a istream_iterator from the stringstream
        // Note the <int> because you want to read them
        //as integers. If you want them as strings use <std::string>
        auto start = std::istream_iterator<int>{ ss };
        //create an empty istream_iterator to denote the end
        auto end= std::istream_iterator<int>{};
        //create a vector from the range: start->end
        std::vector<int> input(start, end);
    
    }

lbragile

În loc să se utilizeze un tablou static int arrayNumbers[n] care necesită să știți câte numere va introduce utilizatorul înainte de compilare, ar trebui să folosiți un array dinamic, cum ar fi std::vector<int> care își poate schimba dimensiunea în timpul execuției.

De exemplu:

#include <iostream> 
#include <vector>

using namespace std;

int main()
{
    vector<int> vecNumbers; // a dynamic array of integers
    while(!cin.fail())
    {
        int value;
        cout << "Enter a value: ";
        cin >> value; // don't forget the semicolon
        if(!cin.fail()) // not having this will add another 0 to the vector
            vecNumbers.push_back(value);
    }
    
    // print the final vector (can ignore for your question)
    vector<int>::const_iterator vecItr;
    cout << "
vecNumbers = [";
    for(vecItr = vecNumbers.begin(); vecItr != vecNumbers.end(); vecItr++)
    {
        if(vecItr != vecNumbers.end()-1)
            cout << *vecItr << ", ";
        else
           cout << *vecItr << "]";
    }

    return 0;
}

Output:

Enter a value: 5
Enter a value: 6
Enter a value: 7
Enter a value: 8
Enter a value: s

vecNumbers = [5, 6, 7, 8] 

Observați că !cin.fail() detectează când tipul de intrare nu se potrivește și astfel încheie bucla. Astfel, ați putea avea o instrucțiune care să menționeze acest lucru, cum ar fi „când s-a terminat, introduceți orice caracter pentru a termina”.

De asemenea, rețineți că I #include <vector> și using namespace std, dacă nu aveți, atunci puteți folosi pur și simplu std::vector<int>, std::cout, și std::cin.

Tags:, ,