Terminare un flusso di input con un carattere specificato, ad esempio "|"?
Attualmente sto imparando C ++, principiante.
Ho un problema quando si termina l'input con "|" carattere, il mio programma salta alla fine / termina e non consente ulteriori input. Credo che sia perché std :: cin è in uno stato di errore a causa dell'inserimento di un carattere quando ci si aspetta un int, quindi ho provato a usare std :: cin.clear () e std :: cin.ignore () per cancellare il problema e consentire l'esecuzione del resto del programma ma non riesco ancora a risolverlo, qualsiasi consiglio è apprezzato.
int main()
{
std::vector<int> numbers{};
int input{};
char endWith{ '|' };
std::cout << "please enter some integers and press " << endWith << " to stop!\n";
while (std::cin >> input)
{
if (std::cin >> input)
{
numbers.push_back(input);
}
else
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max());
}
}
E poi passa il vettore a una funzione per iterare attraverso x quantità di volte e aggiungere ogni elemento a un totale, ma il programma salta sempre oltre l'input dell'utente:
std::cout << "Enter the amount of integers you want to sum!\n";
int x{};
int total{};
std::cin >> x;
for (int i{ 0 }; i < x; ++i)
{
total += print[i];
}
std::cout << "The total of the first " << x << " numbers is " << total;
Per favore aiuto!
Risposte
Quando l'uso entra in un "|" (o qualsiasi cosa che non sia an int
), il ciclo termina e la gestione degli errori che si trova all'interno del ciclo non viene eseguita. Basta spostare il codice di errore all'esterno del ciclo. Inoltre, leggi da stdin
due volte che salterà ogni altro int.
while (std::cin >> input) {
numbers.push_back(input);
}
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Nota: se desideri controllare specificamente "|" può cambiare in qualcosa di simile:
while (true) {
if (std::cin >> input) {
numbers.push_back(input);
}
else {
// Clear error state
std::cin.clear();
char c;
// Read single char
std::cin >> c;
if (c == '|') break;
// else what to do if it is not an int or "|"??
}
}
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');