2017-08-03 7 views
1

J'essaie de lire les entiers de la console dans mon vecteur d'ints. Je veux continuer à lire des entiers à partir d'une seule ligne jusqu'à ce que l'utilisateur clique sur Entrée. J'ai essayé d'utiliser getline et stringstream, mais il continue à chercher des entrées après avoir appuyé sur enter. Des solutions?Comment lire les entiers de la console en vecteur avec cin

Une description de haut niveau: Ce programme lit des nombres à partir de la console et les pousse à l'arrière d'un vecteur. Le vecteur est ensuite trié et deux pointeurs sont créés pour pointer vers l'arrière et vers l'avant. L'utilisateur peut alors entrer une somme que le programme cherchera ensuite en temps linéaire en prenant la somme des deux pointeurs. Les pointeurs continueront alors à se déplacer dans une direction jusqu'à ce qu'ils trouvent une telle somme ou déterminent qu'une telle somme n'existe pas.

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <sstream> 
using namespace std; 

int findSum(vector<int> tempVec, int sum) 
{ 
    int i; 
    cout << "Sorted sequence is:"; 
    for (i = 0; i < tempVec.size(); i++) 
     cout << " " << tempVec[i]; 
    cout << endl; 

    int *ptr1 = &tempVec[0]; 
    cout << "ptr1 points to: " << *ptr1 << endl; 
    int *ptr2 = &tempVec[tempVec.size() - 1]; 
    cout << "ptr2 points to: " << *ptr2 << endl; 

    int count = 0; 
    while (ptr1 != ptr2) 
    { 

     if ((*(ptr1) + *(ptr2)) == sum) 
     { 
      cout << *(ptr1) << " + " << *(ptr2) << " = " << sum; 
      cout << "!" << endl; 
      return count; 
     } 
     if ((*(ptr1) + *(ptr2)) < sum) 
     { 
      cout << *(ptr1) << " + " << *(ptr2) << " != " << sum; 
      ptr1 = ptr1 + 1; 
      cout << ". ptr1 moved to: " << *ptr1 << endl; 
      count++; 
     } 
     else 
     { 
      cout << *(ptr1) << " + " << *(ptr2) << " != " << sum; 
      ptr2 = ptr2 - 1; 
      cout << ". ptr2 moved to: " << *ptr2 << endl; 
      count++; 
     } 
    } 
    return -1; 
} 

int main() 
{ 
    int ValSum; 
    cout << "Choose a sum to search for: "; 
    cin >> ValSum; 


    vector<int> sumVector; 
    int input; 
    cout << "Choose a sequence to search from: "; 
    while (cin >> input != "\n") 
    { 
     //getline(cin, input); 
     if (cin == '\0') 
      break; 
     sumVector.push_back(input); 
    } 
    sort(sumVector.begin(), sumVector.end()); 


    int count = findSum(sumVector,ValSum); 
    if (count == -1) 
     cout << "\nThe sum " << ValSum << " was NOT found!" << endl; 
    else 
    { 
     cout << "\nThe sum " << ValSum << " was found!" << endl; 
     cout << count + 1 << " comparisons were made." << endl; 
    } 
    sumVector.clear(); 
} 
+1

Offrir l'option de la réponse suivante 2 un jars. La seule différence est que vous utilisez cin plutôt qu'un fichier: https://stackoverflow.com/a/7868998/4581301 – user4581301

+0

Où est 'getline' et' stringstream' dans votre code? – Barmar

+0

'getline' et' stringstream' est la bonne façon de résoudre ce problème, donc vous devez avoir mal agi. 'getline' ne devrait pas être dans la boucle - vous le faites une fois, puis lisez depuis le' stringstream' dans la boucle. – Barmar

Répondre

1

cin avec l'opérateur d'entrée >> mange tous les espaces avant qu'il ne vous arrive, donc input ne sera jamais \n.

Mais ce n'est même pas le plus gros problème. cin >> input ne renvoie pas ce qui vient d'être lu, mais plutôt une référence au flux lui-même (voir here). Cela signifie que votre code while (cin >> input != "\n") ne fait pas tout à fait ce que vous pensez (honnêtement, cela ne devrait même pas compiler).

Pour lire une ligne d'entiers de stdin dans un vecteur, vous le feriez si quelque chose comme ceci:

string line; 
int num; 
vector<int> v; 

getline(cin, line); 
istringstream iss(line); 

while(istringstream >> num) { 
    v.push_back(num); 
} 
+0

Avec cela, je reçois une erreur de segmentation une fois que j'atteins getline (cin, ligne); – Grigor

+0

@Grigor pouvez-vous donner un lien ideone (ideone.com) avec le code en question? C'est probablement quelque chose d'une autre ligne de votre code juste avant. – scohe001

0

Utilisez

std::vector<int> v; 
std::string line; 

// while (!v.empty()) { // optional check to make sure we have some input 
std::getline(std::cin, line); // gets numbers until enter is pressed 
std::stringstream sstream(line); // puts input into a stringstream 
int i; 

while (sstream >> i) { // uses the stringstream to turn formatted input into integers, returns false when done 
    v.push_back(i); // fills vector 
} 
// } 
+0

Vous pouvez vous débarrasser de la boucle 'while' en utilisant' std :: copy() 'avec' std :: istream_iterator' et 'std :: back_inserter', par exemple:' std :: copy (std :: istream_iterator (sstream), std :: istream_iterator (), std :: back_inserter (v)); ' –

+0

Alors que (get it?) c'est une utilisation impressionnante de STL, je dois dire que c'est beaucoup plus difficile à comprendre pour moins programmeurs expérimentés. Parfois, ces utilitaires conduisent à un code plus court et plus lisible, parfois ils ne le font pas. – jwilson