Question

Je suis en train de rassembler dans une variable de chaîne l'entrée de l'utilisateur qui accepte pour un montant espacements de temps.

Depuis la cin >> str habituelle n'accepte pas les espaces blancs, donc je partirais avec std :: getline de

Voici mon code:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        string local;
        getline(cin, local); // This simply does not work. Just skipped without a reason.
        //............................
    }

    //............................
    return 0;
}

Toute idée?

Était-ce utile?

La solution

Vous pouvez voir pourquoi cela échoue si vous produisez ce que vous avez enregistré dans local (ce qui est un mauvais nom de la variable, par la voie: P):

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        string local;
        getline(cin, local);
        std::cout << "> " << local << std::endl;
    }

    //............................
    return 0;
}

Vous le verrez imprime une nouvelle ligne après > immédiatement après avoir entré votre numéro. Il passe ensuite à entrer le reste.

Ceci est parce que getline vous donne la ligne vide au-dessus de l'entrée gauche de votre numéro. (Il lit le nombre, mais apparemment ne supprime pas le \n, de sorte que vous vous retrouvez avec une ligne vide.) Vous devez vous débarrasser de tout premier des espaces restant:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    cin >> ws; // stream out any whitespace
    for(int i = 0; i < n; i++)
    {
        string local;
        getline(cin, local);
        std::cout << "> " << local << std::endl;
    }

    //............................
    return 0;
}

les travaux comme prévu.

Hors sujet, peut-être était seulement pour l'extrait à portée de main, mais le code tend à être plus lisible si vous n'avez pas using namespace std;. Il va à l'encontre du but de namespaces. Je soupçonne que ce ne fut que pour l'affichage ici, cependant.

Autres conseils

Déclarer un caractère à obtenir dans la voiture retour après avoir tapé dans le number.char ws;int n;cin>>n;ws=cin.get(); Cela permettra de résoudre le problème.

  

Utilisation cin>>ws au lieu de ws=cin.get(), fera le premier caractère de votre chaîne à être ws variables, au lieu de simplement effacer '\n'.

frappons vous entrez? Sinon rien obtenir ligne sera de retour, car il attend la fin de la ligne ...

Je suppose que vous ne lisez pas correctement n, il est donc convertir zéro. Puisque 0 n'est pas moins que 0, la boucle exécute jamais.

Je rajouterais un peu d'instrumentation:

int n;
cin >> n;
std::cerr << "n was read as: " << n << "\n"; // <- added instrumentation
for // ...
  • est n correctement initialisé depuis l'entrée?
  • Vous ne semble pas faire quoi que ce soit avec getline. Est-ce que vous voulez?
  • getline renvoie une référence istream. Est-ce que le fait que vous laisser tomber sur la question du sol?

Sur quel compilateur avez-vous essayé cela? J'ai essayé sur VC2008 et a bien fonctionné. Si je compilé le même code sur g ++ (GCC) 3.4.2. Il n'a pas fonctionné correctement. Ci-dessous les versions de travail dans les deux compilateurs. Je Dont't ai le dernier compilateur g ++ dans mon environnement.

int n;
cin >> n;
string local;
getline(cin, local); // don't need this on VC2008. But need it on g++ 3.4.2. 
for (int i = 0; i < n; i++)
{
    getline(cin, local);
    cout << local;
}

La question importante est « ce que vous faites avec la chaîne qui vous donne l'idée que l'entrée a été ignorée? » Ou, plus exactement, « pourquoi pensez-vous que l'entrée a été ignorée? »

Si vous faites un pas dans le débogueur, avez-vous compilez avec l'optimisation (qui est autorisé à modifier l'ordre des instructions)? Je ne pense pas que ce soit votre problème, mais il est possible.

Je pense qu'il est plus probable que la chaîne est peuplée mais il est pas manipulé correctement. Par exemple, si vous voulez passer l'entrée aux anciennes fonctions C (par exemple., atoi()), vous devez extraire la chaîne de style C (local.c_str()).

Vous pouvez utiliser directement la fonction getline dans la chaîne en utilisant delimiter comme suit:

#include <iostream>
using namespace std;
int main()
{
    string str;
    getline(cin,str,'#');
    getline(cin,str,'#');
}

vous pouvez entrer str autant de fois que vous voulez, mais une condition applique ici est que vous devez passer « # » (3ème argument) en tant que chaîne de c.-à-delimiter acceptera une entrée jusqu'à « # » a été pressé quel que soit le caractère de nouvelle ligne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top