J'essaie de collecter l'entrée de l'utilisateur dans une variable de chaîne qui accepte les espaces blanchisseurs pour une durée spécifiée.
Depuis l'habituel voici mon code: p> aucune idée? p> p> p> CIN >> STR CODE> n'accepte pas les espaces. "D aller avec std :: getline de
12 Réponses :
Vous frappez-vous? Si vous n'êtes pas de la ligne ne retournera rien, car il attend de la fin de la ligne ... P>
Oui. J'ai essayé de l'imprimer, et n code> est initialisé correctement. --- J'ai coupé les codes après la gaine.
Je suppose que vous ne lisez pas correctement J'ajouterais un peu d'instrumentation: p> n code>, donc il convient à zéro. Depuis 0 n'est pas moins que 0, la boucle ne s'exécute jamais.
Non, la boucle exécute. J'utilise VC ++ 2008, je serais donc en mesure de déboguer en traçant la ligne de code par ligne.
sur quel compilateur avez-vous essayé cela? J'ai essayé sur VC2008 et j'ai travaillé bien. Si j'ai compilé le même code sur g ++ (GCC) 3.4.2. Cela n'a pas fonctionné correctement. Vous trouverez ci-dessous les versions travaillées dans les deux compilateurs. Je n'ai pas 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;
}
Vous pouvez voir pourquoi cela échoue si vous donnez ce que vous avez enregistré dans Vous verrez qu'il imprime une nouvelle ligne après Ceci est parce que ceci fonctionne comme prévu. p> Off thème, peut-être que ce n'était que pour l'extrait à la main, mais le code a tendance à être plus em> lisible Si vous n'avez pas local code> (qui est un nom de variable médiocre, à la manière suivante: p): > code> immédiatement après avoir saisi votre numéro. Il passe ensuite à la saisie du reste. P> getline code> vous donne la ligne vide laissée de l'entrée de votre numéro. (Il lit le nombre, mais apparemment ne supprime pas le \ n code>, donc vous êtes laissé avec une ligne vierge.) Vous devez vous débarrasser d'un autre blanc restant: p> < pré> xxx pré> à l'aide de NAMESPACE STD; code>. Il défait le but des espaces de noms. Je soupçonne que ce n'était que pour la publication ici, cependant. P> p>
J'ai tendance à utiliser explicitement le préfixe STD :: Nomspace Prefix moi-même, mais il n'y a rien de mal à utiliser une déclaration dans un fichier CPP (non h).
Peut-être dans un exemple aussi simple. Il y a beaucoup i> de choses dans l'espace de noms std code>, cependant. Le niveau de fonction est le plus global que je vais utiliser avec en utilisant des directives code>.
La question importante est "Que faites-vous avec la chaîne qui vous donne l'idée que l'entrée a été ignorée?" Ou, plus précisément, "pourquoi pensez-vous que l'entrée a été ignorée?" P>
Si vous entrez dans le débogueur, avez-vous compilé avec optimisation (qui est autorisée à réorganiser des instructions)? Je ne pense pas que ce soit votre problème, mais c'est une possibilité. P>
Je pense qu'il est plus probable que la chaîne soit peuplée, mais elle n'est pas traitée correctement. Par exemple, si vous souhaitez transmettre l'entrée sur les fonctions d'Old C (par exemple, ATOI () code>), vous devrez extraire la chaîne de style C ( local.c_str () code>). p>
Déclarez un caractère à Utilisation Char WS; INT N; CIN >> N; WS = CIN.GET (); / code>
Cela résoudra le problème. P>
CIN >> WS code> au lieu de ws = cin.get () code>, fera un premier caractère de votre chaîne pour être dans la variable ws code >, au lieu de simplement effacer '\ n' code>. p>
blockQuote>
Vous pouvez utiliser directement la fonction GetLine dans la chaîne à l'aide de Délimiter comme suit:
#include <iostream>
using namespace std;
int main()
{
string str;
getline(cin,str,'#');
getline(cin,str,'#');
}
même peut être inséré en boucle.
C'est assez simple. U JST besoin de mettre un cin.get () à la fin de la boucle. P>
ça marche pour, merci
Il suffit d'utiliser cin.sync () code> avant la boucle. p>
Il suffit de distribuer le correctif ne vous aide pas. Veuillez expliquer votre réponse également pour que cela soit bénéfique pour l'OP et les autres dans la communauté. La "raison" derrière est plus importante que la "solution".
avant et ainsi de suite. P> p> getline (CIN, local) code>, il suffit d'ajouter si (i == 0) {cin.ignore (); } code>. Cela supprimera le dernier caractère ( \ n code>) de la chaîne, ce qui cause ce problème et sa nécessité uniquement pour la première boucle. Sinon, il supprimera le dernier caractère de la chaîne de chaque itération. Par exemple,
Il suffit d'ajouter cin.ignore () avant de getline et il fera le travail
#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;
cin.ignore();
getline(cin, local);
}
return 0;
}
Comment cela offre-t-il une amélioration de la réponse postée il y a deux mois par Pranav Rani? En outre, ils offrent une explication et B> Leur réponse fonctionne.
Très rarement fait les choses échouent sans aucune raison.
Essayez ce qui suit avant la boucle: STD :: COUT << "N:" << N << STD :: endl;
Oui. n a été lu correctement. J'ai entré 2 pour le N, et il imprime "N: 2"
Je pense avoir résolu votre problème. Mais concernant votre débogage, vous avez fait i> d'autres valeurs que 2, non? La boucle est entrée, elle "saute" la première entrée.