Как читать ввод со стандартного ввода, пока не нажата пробел или табуляция?

Мне нужно читать ввод из стандартного ввода, пока не будет нажата пробел или табуляция.

В конце концов, мне нужно держать вход в 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;

}
Другие вопросы по тегам