C++ Academy · Lekcja

Bezpieczne odczytywanie danych za pomocą getline

Używaj std::getline do odczytu wierszy i sprawdzaj dane użytkownika przed ich użyciem

Lekcja 3 z 413 kroki

Bezpieczne odczytywanie danych za pomocą getline to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.

Dlaczego bezpieczne wczytywanie danych jest ważne

Dane wprowadzane przez użytkownika są najczęstszym źródłem awarii. Nieprawidłowy typ, pusty wiersz lub nieoczekiwane znaki mogą spowodować nieprawidłowe działanie naiwnego programu. Odporne na błędy odczytywanie danych jest niezbędne.

Podstawy std::getline

std::getline(stream, line) odczytuje znaki aż do następnego znaku nowego wiersza. Znak nowego wiersza zostaje pobrany, ale nie jest zapisywany.

std::string line;
std::getline(std::cin, line);

Niestandardowe separatory

Przekaż trzeci argument, aby zatrzymać odczyt przy dowolnym znaku, a nie tylko przy znaku nowego wiersza.

std::string field;
std::getline(std::cin, field, ',');

Sprawdzanie poprawności danych liczbowych

Najpierw odczytaj cały wiersz, a następnie go sparsuj. Pozwala to uniknąć przejścia cin w stan błędu, gdy dane wejściowe są niepoprawne.

std::string line;
int n;
if (std::getline(std::cin, line)) {
    try {
        n = std::stoi(line);
    } catch (...) {
        std::cout << "Invalid number\n";
    }
}

Pętla do momentu uzyskania poprawnych danych

Połącz getline z try/catch, aby ponawiać prośbę o dane do momentu wprowadzenia przez użytkownika poprawnej wartości.

int age;
while (true) {
    std::cout << "Age: ";
    std::string line;
    std::getline(std::cin, line);
    try {
        age = std::stoi(line);
        if (age >= 0 && age < 150) break;
    } catch (...) {}
    std::cout << "Try again.\n";
}

Wykrywanie EOF w getline

getline ustawia strumień w stanie błędu po napotkaniu EOF. Po wywołaniu sprawdź stan strumienia.

std::string line;
while (std::getline(std::cin, line)) {
    process(line);
}

Usuwanie białych znaków

Użytkownicy często dodają przypadkowe spacje. Po odczycie usuń białe znaki z obu końców.

void trim(std::string& s) {
    size_t start = s.find_first_not_of(" \t\r\n");
    size_t end   = s.find_last_not_of(" \t\r\n");
    s = (start == std::string::npos) ? "" : s.substr(start, end - start + 1);
}

Czyszczenie strumienia

Jeśli łączysz >> i getline, najpierw usuń pozostałe znaki.

std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

Wczytywanie wielu wartości z wiersza

Odczytaj cały wiersz, a następnie przekaż go do stringstreama i pobierz z niego wartości.

std::string line;
std::getline(std::cin, line);
std::istringstream iss(line);
int a, b, c;
iss >> a >> b >> c;

Ochrona przed nadmierną długością

Odrzucaj zbyt długie dane wejściowe odpowiednio wcześnie, aby zapobiec niezamierzonemu wyczerpaniu zasobów.

std::string line;
if (std::getline(std::cin, line) && line.size() > 1024) {
    std::cout << "Input too long.\n";
    return 1;
}

Wczytywanie haseł lub ukrytych danych

Biblioteka standardowa nie ukrywa znaków wyświetlanych podczas wprowadzania danych. W przypadku monitów o hasło użyj platformowych interfejsów API, takich jak termios w systemach Unix lub SetConsoleMode w systemie Windows.

Szybkie sprawdzenie

Dlaczego bezpieczniej jest wczytać dane za pomocą getline, a następnie je sparsować, zamiast używać std::cin >> n?

Podsumowanie

Wczytuj dane użytkownika za pomocą std::getline, oddzielaj sprawdzanie poprawności od parsowania i usuwaj białe znaki. Umieść parsowanie w bloku try/catch i ponawiaj je do momentu uzyskania poprawnej wartości. Podczas łączenia pobierania danych z odczytywaniem wierszy czyść strumień.

Bezpłatny start

Ucz się C++ dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
51
Lekcje
203

Często zadawane pytania

Czy lekcja „Bezpieczne odczytywanie danych za pomocą getline” jest bezpłatna?

Tak — pełny tekst „Bezpieczne odczytywanie danych za pomocą getline” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Bezpieczne odczytywanie danych za pomocą getline”?

Używaj std::getline do odczytu wierszy i sprawdzaj dane użytkownika przed ich użyciem Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C++ Academy?

Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Bezpieczne odczytywanie danych za pomocą getline”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?

Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Prawidłowe używanie std::cin i std::cout
  2. Formatowanie wyjścia za pomocą iomanip
  3. Bezpieczne odczytywanie danych za pomocą getline
  4. Praca ze strumieniami std::cerr i std::clog
← Powrót do C++ Academy