-
Notifications
You must be signed in to change notification settings - Fork 0
/
readint.cpp
68 lines (60 loc) · 2.38 KB
/
readint.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <cstdio>
#include <iostream>
#include <string>
#include <stdexcept>
#include "readint.h"
/***
* Funkce, která přečte long long int ze vstupu a zkontroluje jestli tam je jen toto číslo
* @param keep - určuje zda se jedná o poslední čílo na řádku (0) či nikoliv (1)
* @except runtime_error - vyskytne se v případě, kdy vstup nebyl validní
* @return - 1 v případě úspěchu, 0 v případě neúspěchu
*/
long long int read_lint(int keep) {
static std::string buffer;
static unsigned int idx = 0; // Pozice, kde v bufferu jsme (není nulová, pokud čteme jiné než 1. číslo z řádku)
static int loaded = 0; // Máme načteno něco v bufferu?
long long int num = 0;
if (!loaded) { // Pokud nemáme nic načteno, přečteme standartní vstup
getline(std::cin, buffer);
if (std::cin.fail())
throw (std::runtime_error("Neplatný zápis, zkuste prosím znovu: "));
idx = 0;
}
loaded = 1;
while (idx < buffer.length() && buffer[idx] == ' ') // Odignorujeme počáteční mezery
++idx;
if (buffer[idx] < '0' || buffer[idx] > '9') {
// Pokud máme něco jiného než číslo, skončíme neúspěchem
loaded = 0;
if (idx == buffer.length())
throw (std::runtime_error("Příliš málo zadaných čísel, zkuste prosím znovu: "));
else
throw (std::runtime_error("Neplatný zápis, zkuste prosím znovu: "));
}
while (idx < buffer.length() && buffer[idx] >= '0' && buffer[idx] <= '9') {
// Přečteme celé číslo
num *= 10;
num += buffer[idx] - '0';
++idx;
}
if (!keep) {
// Pokud máme přečíst poslední číslo z řádku, zkontrolujeme, zda již na řádce skutečně nic není
while (idx < buffer.length() && buffer[idx] == ' ')
++idx;
loaded = 0; // Čteme až do konce řádky (bufferu), takže při dalším volání fce už chceme oznámit, že nemáme načteno nic
if (idx < buffer.length()) {
// Na řádce ještě něco bylo - skončíme neúspěchem
throw (std::runtime_error("Příliš mnoho zadaných čísel, zkuste prosím znovu: "));
}
}
return num;
}
/***
* Obalující funkce, která přečte nikoli long long int, ale int
* @param keep - určuje zda se jedná o poslední čílo na řádku (0) či nikoliv (1)
* @except runtime_error - vyskytne se v případě, kdy vstup nebyl validní
* @return - 1 v případě úspěchu, 0 v případě neúspěchu
*/
int read_int(int keep) {
return (int) read_lint(keep);
}