2017-09-07 16 views
0

Lorsque je tente de lire l'entrée de la console comme ceci:Pourquoi cout ne fonctionne pas?

6 6 4 
1 1 1 
2 1 1 
1 2 1 
2 2 1 

Avec morceau de code suivant, pour chaque ligne de triplés, je veux simple à calculer (n/a + 1) * (m/a + 1) et affiche le résultat sur la console.

while(cin.get()!='\n'){ 
    int n=0, m = 0, a =0; 
    cin >> n >> m >> a; 

    cout <<(n/a+1) * (m/a+1) << endl; 

} 

Cependant, cela ne fonctionne pas, pourquoi?

+3

Vous savez que 'cin.get()' va * extraire * un caractère du tampon d'entrée. Ce personnage sera perdu pour toujours. Si vous voulez lire une ligne à la fois, utilisez ['std :: getline'] (http://en.cppreference.com/w/cpp/string/basic_string/getline) et [' std :: istringstream' ] (http://en.cppreference.com/w/cpp/io/basic_istringstream) pour l'extraction. –

+3

Bienvenue dans le débordement de la pile. "ça ne marche pas" Pouvez-vous dire ce qui se passe? – philant

+0

shin J'ai répondu à votre question, l'avez-vous vue? – gsamaras

Répondre

7

ici:

while(cin.get()!='\n') 

vous extrayez un caractère d'entrée standard, chaque fois que l'état de la boucle évalue. En conséquence, ce caractère est déjà consommé lorsque vous tentez d'analyser votre triplet.


Utilisez std::getline() pour analyser la ligne d'entrée par ligne, et de chaque ligne, obtenir le triplet.

Exemple:

#include <sstream> 
#include <string> 
#include <iostream> 

int main() { 
    std::string line; 
    while (std::getline(std::cin, line)) 
    { 
     std::istringstream iss(line); 
     int n, m, a; 
     if (!(iss >> n >> m >> a)) { break; } // error 
     std::cout <<(n/a+1) * (m/a+1) << std::endl; 
    } 
    return 0; 
} 

Sortie:

4 
4 
6 
6 
9 

PS: Pour votre information (n/a+1) * (m/a+1) sera débordement si n et m sont 100 000 et a est le numéro un seul chiffre. Tapez cast le résultat de la multiplication à long int sice m, n, a sont des entiers, comme ceci const_cast<long int>((n/a+1) * (m/a+1)).