Подтвердить что ты не робот

Как использовать cin между строками в С++?

Я новичок в С++ и изучал такие вещи:

cout << "My age is: ";
cin >> age;

Беседуя с cin, я столкнулся с блокпостом.

Скажем, я хотел написать "Мне x лет!".

"x", являющийся cin → age;

Я пишу код следующим образом.

cout << "I am ";
cin >> age;
cout << "years old!";

Дорожный блок состоит в том, что это вызывает разрыв строки.

Я не хочу, чтобы строка прерывалась.

Как я могу все это остаться на одной линии?

4b9b3361

Ответ 1

Я предполагаю, что вы действительно хотите, чтобы входные данные совпадали с конечным результатом. В противном случае решение тривиально: сначала прочитайте значение и затем распечатайте его, например:

std::cout << "how old are you? ";
std::cin >> x;
std::cout << "I am " << x << " years old\n";

Работа с вводом, который соответствует результату, немного сложнее. Проблема здесь в том, что обработка консоли фактически выполняется системой, а не языком. В результате при вводе данных необходимо дождаться новой строки. Новая строка будет обрабатываться консолью и создать разрыв строки. Чтобы отключить это поведение, необходимо работать, опираясь на поведение консоли. Не существует стандартного способа С++.

Я не знаю, как обращаться с консольными элементами управления в Windows: я в первую очередь программист UNIX. В системе UNIX вы должны использовать tcgetattr() и tcsetattr(), чтобы установить режим ввода неканоническим (т.е. Очистить бит ICANON). Требуемый файловый дескриптор - это просто стандартный для ввода, т.е. 0.

Когда консоль использует неканонический режим, все нажатия клавиш сразу же перенаправляются в приложение, и эхо-сигнал экрана не выполняется. В результате функция чтения действительно должна будет эхо-символа отдельных символов, а затем переходить к функции синтаксического анализа. Самый простой способ - создать буфер фильтра фильтрации, который выполняет эхо-повторение для std::cin до std::cout при пересылке символа. Однако, все это вместе - немного работы...

При приготовлении демонстрации я заметил, что мне также нужно иметь дело с эхом (чтобы избежать новой строки, когда пользователь использует клавишу ввода). Также важно reset консольные флаги, поскольку некоторые из них фактически остаются измененными даже после завершения программы. Реализация, ставящая биты вместе, но все еще без обработки ошибок, может выглядеть так:

#include <iostream>
#include <ctype.h>
#include <termios.h>

struct non_canon_buf
    : std::streambuf {
    char buffer;
    non_canon_buf() {
        termios flags = {};
        tcgetattr(0, &flags);
        flags.c_lflag &= ~(ICANON | ECHO);
        tcsetattr(0, TCSANOW, &flags);
    }
    ~non_canon_buf() {
        termios flags = {};
        tcgetattr(0, &flags);
        flags.c_lflag |= ICANON | ECHO;
        tcsetattr(0, TCSANOW, &flags);
    }
    int underflow() {
        if (std::cin.get(buffer)) {
            this->setg(&buffer, &buffer, &buffer + 1);
            if (!std::isspace(static_cast<unsigned char>(buffer))) {
                std::cout << buffer << std::flush;
            }
            return std::char_traits<char>::to_int_type(buffer);
        }
        return std::char_traits<char>::eof();
    }
};

int main()
{
    non_canon_buf sbuf;
    std::istream  in(&sbuf);
    std::cout << "I am ";
    int age = 0;
    in >> age;
    std::cout << " years old\n";
    if (!in) {
        std::cout << "ERROR: failed to enter a valid age!\n";
    }
}

Ответ 2

cin читает ввод после ввода новой строки на консоль.

Следовательно, единственный способ, которым вы можете это сделать, - пригласить пользователя на их возраст, а затем продолжить его запись.

например:

std::cout << "Enter your age> ";
std::cin >> age;
std::cout << "I am " << age << " years old" << std::endl;

Ответ 3

unsigned int age;
std::cin >> age;

std::cout << "I am " << age << " years old!" << std::endl;

Ответ 4

Вы не можете делать то, что хотите, в чистом С++. Вы можете сделать так, как предложили другие, и перепечатать строку:

std::cout << "I am " << age << " years old!\n"

Или вы можете использовать функцию, специфичную для ОС, для очистки вывода консоли. Читайте об этом здесь.

Например, вы можете использовать system("cls"); для Windows, чтобы очистить консоль, попросив у пользователя их возраст.

#include <stdlib.h>

int main(int argc, char* argv[]) {
    unsigned int age;
    std::cout << "My age is: "
    std::cin >> age;
    system("cls");
    std::cout << "I am " << age << " years old!\n"
    ...
}

Урожайность:

C:>AgeProgram.exe I am 10 years old

Ответ 5

вы можете сделать это

int user_age;

std:cout<<"Enter Your Age:"         //Ask user for age

std::cin >>user_age;                //Read user input
std::cout<<"I am"<<user_age<<"years old!"<< std::endl; //finlly display the value