Question
Disons que nous avons un code:
int main()
{
char a[10];
for(int i = 0; i < 10; i++)
{
cin>>a[i];
if(a[i] == ' ')
cout<<"It is a space!!!"<<endl;
}
return 0;
}
Comment cin un symbole de l'espace depuis l'entrée standard? Si vous écrivez l'espace, ne tient pas de programme! :( Y at-il une combinaison de symboles (par exemple « l \ » ou quelque chose comme ça) qui signifie « espace » que je peux utiliser l'entrée standard pour mon code?
La solution
Il saute tous les espaces (espaces, tabulations, nouvelles lignes, etc.) par défaut. Vous pouvez modifier son comportement, ou utiliser un mécanisme légèrement différent. Pour modifier son comportement, utilisez le manipulateur noskipws
, comme suit:
cin >> noskipws >> a[i];
Mais, puisque vous semblez comme vous voulez regarder les caractères individuels, je suggère d'utiliser get
, comme celui-ci avant votre boucle
cin.get( a, n );
Note: get
arrête la récupération du flux caractères si elle trouve soit un saut de ligne char (\n
) ou après n-1 caractères. Il arrête tôt pour qu'il puisse ajouter le caractère nul (\0
) au tableau. Vous pouvez en savoir plus sur l'interface istream
.
Autres conseils
#include <iostream>
#include <string>
int main()
{
std::string a;
std::getline(std::cin,a);
for(std::string::size_type i = 0; i < a.size(); ++i)
{
if(a[i] == ' ')
std::cout<<"It is a space!!!"<<std::endl;
}
return 0;
}
entrée à une ligne contenant ENTIER beaucoup d'espaces que vous pouvez utiliser getline(cin,string_variable);
par exemple:
string input;
getline(cin, input);
Ce format capture tous les espaces de la phrase jusqu'à ce return
est pressé
Utilisez cin.get()
pour lire le caractère suivant.
Cependant, pour ce problème, il est très inefficace de lire un caractère à la fois. Utilisez le istream::read()
à la place.
int main()
{
char a[10];
cin.read(a, sizeof(a));
for(int i = 0; i < 10; i++)
{
if(a[i] == ' ')
cout<<"It is a space!!!"<<<endl;
}
return 0;
}
Et l'utilisation ==
pour vérifier l'égalité, et non =
.
En utilisant l'opérateur de cin >> chutera de premier plan des espaces et entrée d'arrêt au premier des espaces de fuite. Pour saisir une ligne d'entrée entière, y compris les espaces, cin.getline()
try. Pour saisir un caractère à la fois, vous pouvez utiliser cin.get()
.
Je pensais que je partagerais la réponse qui a fonctionné pour moi. La ligne précédente est terminée par un saut de ligne, donc la plupart de ces réponses par eux-mêmes n'a pas fonctionné. Cela fait:
string title;
do {
getline(cin, title);
} while (title.length() < 2);
Ce assumait l'entrée est toujours au moins 2 caractères, qui ont travaillé pour ma situation. Vous pouvez également essayer de simplement comparer à la chaîne "\n"
.
Essayez tout cela omnidirectionnel pour prendre d'entrée avec l'espace:)
#include<iostream>
#include<stdio.h>
using namespace std;
void dinput(char *a)
{
for(int i=0;; i++)
{
cin >> noskipws >> a[i];
if(a[i]=='\n')
{
a[i]='\0';
break;
}
}
}
void input(char *a)
{
//cout<<"\nInput string: ";
for(int i=0;; i++)
{
*(a+i*sizeof(char))=getchar();
if(*(a+i*sizeof(char))=='\n')
{
*(a+i*sizeof(char))='\0';
break;
}
}
}
int main()
{
char a[20];
cout<<"\n1st method\n";
input(a);
cout<<a;
cout<<"\n2nd method\n";
cin.get(a,10);
cout<<a;
cout<<"\n3rd method\n";
cin.sync();
cin.getline(a,sizeof(a));
cout<<a;
cout<<"\n4th method\n";
dinput(a);
cout<<a;
return 0;
}
J'ai le même problème et je viens d'utiliser cin.getline(input,300);
.
noskipws
et cin.get()
sont parfois pas facile à utiliser. Puisque vous avez la bonne taille de votre essai de tableau à l'aide cin.getline()
qui ne se soucie pas de tout caractère et lire toute la ligne en nombre de caractères spécifié.