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?

Était-ce utile?

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é.

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