Comment lire une entrée à partir d’une entrée standard jusqu’à ce qu’un espace ou un onglet soit enfoncé?

J’ai besoin de lire l’entrée à partir de l’entrée standard jusqu’à ce qu’un espace ou une tabulation soit enfoncée.

Finalement, j’ai besoin de contenir l’entrée dans un object std::ssortingng .

Puisqu’un onglet compte comme un espace , vous demandez d’extraire le premier jeton du stream. C’est très simple en C ++, l’extraction de jetons étant déjà le comportement par défaut de l’opérateur >> :

 #include  #include  int main() { std::ssortingng token; if (!(std::cin >> token)) { /* error */ return 1; } // now you have the first token in "token". } 

(L’erreur ne peut se produire que dans des circonstances obscures, par exemple lorsque le descripteur de fichier d’entrée est déjà fermé au démarrage du programme.)

 #include  #include  int main() { std::ssortingng result; std::cin >> std::noskipws; //don't skip whitespaces char c; while (std::cin >> c) { if(c == '\t' || c == ' ') break; result.push_back(c); } } 

Vous pouvez utiliser getch() ou getchar() pour lire chaque caractère séparément, puis traiter l’entrée manuellement afin que, lorsqu’un appui sur un espace ou une tabulation soit enfoncé, vous getch() fin à l’entrée.

Cela devrait faire le travail:

 #include  int main () { char c; do { c=getchar(); /** Your code here **/ } while ((c != ' ') && (c != '\t')); return 0; } 

Vous pouvez avoir std::cin pour arrêter la lecture de n’importe quel caractère désigné en utilisant

 char temp[100]; std::cin.getline(temp, 100, '\t'); 

Je ne sais pas si vous pouvez facilement le faire fonctionner avec deux personnages cependant.

La réponse simple est que vous ne pouvez pas. En fait, la façon dont vous avez formulé la question montre que vous ne comprenez pas l’entrée istream : il n’y a pas de «pression» dans istream , car rien ne garantit que l’entrée provient d’un clavier.

Vous avez probablement besoin de curses ou ncurses , ce qui comprend la saisie au clavier; sortie de la console et le rest.

Il semble que la solution à ce problème est en effet beaucoup plus simple avec scanf("%[^\t ]", buffer) . Si vous voulez le faire en utilisant C ++ IOStreams, je pense que l’option la plus agréable à utiliser est d’installer un std::locale avec une facette std::ctype modifiée qui utilise une interprétation modifiée de ce qui est considéré comme un espace, puis lit un std::ssortingng (voir par exemple cette réponse que j’ai donnée pour un problème similaire). Indépendamment du fait que vous utilisiez une approche C ou C ++, vous devrez probablement désactiver la mise en mémoire tampon de la ligne sur l’entrée standard si vous souhaitez connaître l’espace ou la tabulation lorsqu’elle est entrée plutôt que lorsque la ligne entière est donnée à votre programme .

utilisez scanf pour cela:

Un code simple:

 #include #include int main() { char t[1000]={'\0'}; scanf("%[^\t ]",t); printf("%s",t); std::ssortingng mains(t); return 1; }