Как читать ввод со стандартного ввода, пока не нажата пробел или табуляция?
Мне нужно читать ввод из стандартного ввода, пока не будет нажата пробел или табуляция.
В конце концов, мне нужно держать вход в std::string
объект.
8 ответов
Поскольку вкладка считается пробелом, вы просите извлечь первый токен из потока. Это очень легко в C++, так как извлечение токенов уже является поведением по умолчанию >>
оператор:
#include <iostream>
#include <string>
int main()
{
std::string token;
if (!(std::cin >> token)) { /* error */ return 1; }
// now you have the first token in "token".
}
(Ошибка может возникнуть только в загадочных обстоятельствах, например, когда дескриптор входного файла уже закрыт при запуске программы.)
#include <iostream>
#include <string>
int main()
{
std::string result;
std::cin >> std::noskipws; //don't skip whitespaces
char c;
while (std::cin >> c)
{
if(c == '\t' || c == ' ')
break;
result.push_back(c);
}
}
Это должно сделать работу:
#include <stdio.h>
int main ()
{
char c;
do {
c=getchar();
/** Your code here **/
} while ((c != ' ') && (c != '\t'));
return 0;
}
Ты можешь использовать getch()
или же getchar()
чтобы прочитать каждый символ отдельно, а затем обработать ввод вручную, чтобы при нажатии пробела или табуляции ввод завершался.
Кажется, что решение этого, действительно, намного проще, используя scanf("%[^\t ]", buffer)
, Если вы хотите сделать это с помощью C++ IOStreams, я думаю, что лучше всего использовать вариант установки std::locale
с измененным std::ctype<char>
аспект, который использует измененную интерпретацию того, что считается пробелом, а затем прочитать std::string
(см., например, этот ответ, который я дал для аналогичной проблемы). Независимо от того, используете ли вы подход C или C++, вам, вероятно, нужно отключить буферизацию строки на стандартном вводе, если вы хотите узнать о пробеле или табуляции при его вводе, а не когда вся строка передается вашей программе.,
Вы можете иметь std::cin
прекратить чтение по любому обозначенному символу, используя
char temp[100];
std::cin.getline(temp, 100, '\t');
Я не знаю, сможете ли вы легко заставить его работать с двумя персонажами.
Простой ответ заключается в том, что вы не можете. На самом деле, то, как вы сформулировали вопрос, показывает, что вы не понимаете istream
вход: нет такого понятия, как "нажатие" в istream
, потому что нет никакой гарантии, что ввод поступает с клавиатуры.
Что вам, вероятно, нужно curses
или же ncurses
, который понимает ввод с клавиатуры; консольный вывод и остальное.
Используйте scanf для этого:
Простой код:
#include<iostream>
#include<stdio.h>
int main()
{
char t[1000]={'\0'};
scanf("%[^\t ]",t);
printf("%s",t);
std::string mains(t);
return 1;
}