Может ли клавиатура ENTER интерпретироваться как string :: size_type? - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь этот код для преобразования целых чисел от 0-15 в шестнадцатеричное:

#include <iostream>
#include <string>

using std::cout;
using std::cin;
using std::endl;
using std::string;

int main()
{
    const string hexstring = "0123456789ABCDEF";
    string str;
    string::size_type n;
    string result_str;
    while (cin >> n){
        if (n < hexstring.size()){
            result_str += hexstring[n];         
        }
    }
    cout << result_str << endl;
    return 0;
}

Я хочу, чтобы, когда пользователь вводит:

12 13 14 15

и нажимает ENTER ожидаемый результат должен быть:

CDEF

Однако, даже после нажатия ENTER, пользователю все равно будет предложено ввести. У меня сложилось впечатление, что ENTER не относится к типу string::size_type, поэтому условие while l oop нарушается, что приводит к выходу из l oop. Почему условие остается верным после ввода ENTER?

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Если вход не будет прерван, l oop

while (cin >> n){
    if (n < hexstring.size()){
        result_str += hexstring[n];         
    }
}

бесконечен.

Чтобы прервать l oop, вы можете ввести не число, как, например, буква А'.

До l oop вы могли бы вывести приглашение типа

std::cout << "Enter a sequence of non-negative numbers. Press 'q' to quit.\n"  ;
1 голос
/ 25 марта 2020

При выполнении форматированного ввода (как и вы), «Enter» не является ни символом, ни условием завершения. Это просто часть пробела (например, пробел или табуляция), которая по умолчанию пропускается с целью извлечения данных.

Таким образом, единственное, что он «делает», - это запускает буферизацию строки. в терминальном клиенте и отправьте написанные до сих пор символы в вашу программу, где они обрабатываются (вместе с символом новой строки, который, как я только что сказал, игнорируется).

Если вы хотите прочитать строку за раз , затем сделайте это, используя std::getline. Это будет читать только одну строку ввода. Затем вы можете разобрать его с помощью std::stringstream или какой-либо другой вещи.

Вы можете сделать std::cin не пропустить пробел , но затем пробел между вашими числами закончил бы l oop тоже.

...