Próbuję tego kodu do konwersji liczb całkowitych między 0-15 do szesnastku:

#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;
}

Chcę, aby kiedy typy użytkowników:

12 13 14 15

I trafienia Enter, oczekiwany wynik powinien być:

CDEF

Jednak nawet po uderzeniu Enter, użytkownik jest nadal monitowany o wejście. Byłem pod wrażeniem, że wejście nie jest typu string::size_type, a więc warunek pętli while jest naruszony, prowadząc do wyjścia pętli. Dlaczego warunek jest nadal prawdą po wpisywaniu?

0
Train Heartnet 25 marzec 2020, 19:09

2 odpowiedzi

Najlepsza odpowiedź

Podczas wykonywania sformatowanego wejścia (jak jesteś), "Enter" nie jest postacią ani stanem zakończenia. Jest to tylko kawałek białego znaku (jak przestrzeń lub karta), która jest domyślnie pominięta w celu ekstrakcji danych.

Jako taka, jedyna rzecz, którą "robi" jest wyzwala buforowanie linii w kliencie terminalu i wysłać znaki napisane do twojego programu, gdzie są przetwarzane (wraz z nową linią, która jest ignorowana, jak tylko powiedział).

Jeśli chcesz przeczytać linię na raz, to zrobić, za pomocą std::getline. Spowoduje to przeczytanie dokładnie jednej linii wejściowej. Następnie możesz przeanalizować go z std::stringstream lub inną rzeczą.

Możesz make std::cin nie pomiń białe znaki, ale wtedy przestrzeń między twoimi liczbami zakończyłaby pętlę.

1
Asteroids With Wings 25 marzec 2020, 16:15

Jeśli wejście nie zostanie przerwane pętlą

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

Jest nieskończony.

Aby przerwać pętlę, możesz wprowadzić nie numer, jak na przykład litera "A".

Przed pętlą możesz wyprodukować szybkie coś takiego

std::cout << "Enter a sequence of non-negative numbers. Press 'q' to quit.\n"  ;
1
Vlad from Moscow 25 marzec 2020, 16:32