#include <string>
std::string input;
std::cin >> input;
L'utilisateur veut entrer "Hello World". Mais cin
échoue à l'espace entre les deux mots. Comment puis-je faire cin
prendre à l'ensemble de Hello World
?
Je fais en fait cela avec des structures et cin.getline
ne semble pas fonctionner. Voici mon code:
struct cd
{
std::string CDTitle[50];
std::string Artist[50];
int number_of_songs[50];
};
std::cin.getline(library.number_of_songs[libNumber], 250);
Cela génère une erreur. Des idées?
library
afin qu'il soit clair qu'elle est du typecd
getline
entrer dans un fichierint
. Bien sûr, cela échoue.Réponses:
Vous devez utiliser
cin.getline()
:la source
char
-buffers? Nouscin.getline(input, sizeof(input));
? De plus, ne devriez-vous pas vérifier l'état du retour?sizeof(input)
à la place de 100 dans l'appel àcin.getline()
; cela signifierait que vous pouvez changer la taille du tampon d'entrée et n'avez besoin de changer qu'une ligne au lieu de deux lignes. La modification 2 serait de tester le retour decin.getline()
en utilisant, par exemple,if (!cin.getline(input, sizeof(input))) { ...handle EOF or error... }
ou quelque chose de similaire, pour rappeler à l'OP que les opérations d'entrée, en particulier, sont vulnérables à un comportement inattendu. D'autres réponses en ont également besoin.Cela n'échoue pas; il arrête juste de lire. Il voit un jeton lexical comme une "chaîne".
Utilisez
std::getline
:Notez que ce n'est pas la même chose que
std::istream::getline
, qui fonctionne avec deschar
tampons de style C plutôt questd::string
s.Mettre à jour
Votre question modifiée ne ressemble guère à l'original.
Vous avez essayé d'
getline
entrer dans unint
tampon, pas une chaîne ou un caractère. Les opérations de formatage des flux fonctionnent uniquement avecoperator<<
etoperator>>
. Utilisez l'un d'entre eux (et ajustez-le en conséquence pour une entrée de plusieurs mots), ou utilisezgetline
et convertissez lexicalement enint
après-coup.la source
getline
peut inclure la nouvelle ligne de fin dans la chaîne qu'il renvoie. Si tel est le cas, c'est à vous de le supprimer.La bibliothèque standard fournit une fonction d'entrée appelée
ws
, qui consomme des espaces d'un flux d'entrée. Vous pouvez l'utiliser comme ceci:la source
std::getline(std::cin, s)
, j'obtiendrais une entrée très désordonnée et je dirais, interrompue lors de l'attente d'entrées dans une bouclewhile
/for
. Cette option a résolu mon problème!Utilisation :
la fonction se trouve dans
la source
cin.getline
n'existe pas sur votre système, vous avez fait quelque chose de très mal. Il est fort probable que vous passiez les mauvais arguments. Mieux vaut ne pas blâmer les autres pour vos erreurs ...Vous souhaitez utiliser la fonction .getline dans cin.
J'ai pris l'exemple d' ici . Consultez-le pour plus d'informations et d'exemples.
la source
getline
. C'est démodé. Utilisezgetline
plutôt gratuit , qui peut être utilisé avecstd::string
. [BTW, cplusplus.com n'est pas une ressource recommandée]LA VOIE C
Vous pouvez utiliser la
gets
fonction trouvée dans cstdio (stdio.h dans c):LA VOIE C ++
gets
est supprimé dans c ++ 11.[Recommandé]: Vous pouvez utiliser getline (cin, nom) qui est dans
string.h
ou cin.getline (nom, 256) qui est eniostream
lui-même.la source
gets
impossible à utiliser en toute sécurité. Il a même été complètement supprimé dans C11.J'utilise plutôt la méthode suivante pour obtenir l'entrée:
C'est en fait très facile à utiliser plutôt que de définir la longueur totale du tableau pour une chaîne contenant un caractère espace.
la source