Last modified: June 09, 2022
This article is written in: 🇵🇱
Interakcja z konsolą jest kluczowym mechanizmem, który pozwala programowi na komunikację z użytkownikiem. Dzięki niej można wyświetlać informacje oraz odbierać dane wprowadzane przez użytkownika. Podczas uruchomienia programu, system operacyjny dostarcza trzy główne strumienie:
stdin - strumień wejściowy, skąd program odczytuje dane,stdout - strumień wyjściowy, gdzie program wypisuje dane,stderr - strumień błędów, służący do komunikatów o błędach.W języku C do interakcji z konsolą używamy funkcji z biblioteki stdio.h. Najczęściej są to printf (do wypisywania) oraz scanf (do odczytu).
printf i scanf
| Specyfikator formatu | Typ danych | Opis | 
| %d | int | Całkowita liczba ze znakiem | 
| %u | unsigned int | Całkowita liczba bez znaku | 
| %ld | long | Całkowita liczba długa ze znakiem | 
| %lu | unsigned long | Całkowita liczba długa bez znaku | 
| %lld | long long | Całkowita liczba długa długa ze znakiem | 
| %llu | unsigned long long | Całkowita liczba długa długa bez znaku | 
| %f | float | Liczba zmiennoprzecinkowa | 
| %lf | double | Liczba zmiennoprzecinkowa podwójnej precyzji | 
| %Lf | long double | Liczba zmiennoprzecinkowa z długą precyzją | 
| %c | char | Znak | 
| %s | char | Łańcuch znaków | 
| %p | void | Adres wskaźnika | 
printfFunkcja printf służy do wyświetlania danych na standardowym wyjściu. Może ona przyjmować różne specyfikatory formatu, które określają sposób wyświetlania danych. Przykłady użycia:
#include <stdio.h>
int main() {
    int liczba = 10;
    float liczbaZmiennoprzecinkowa = 3.14;
    char znak = 'A';
    char lancuch[] = "Hello, world!";
    printf("Liczba całkowita: %d\n", liczba);
    printf("Liczba zmiennoprzecinkowa: %.2f\n", liczbaZmiennoprzecinkowa);
    printf("Znak: %c\n", znak);
    printf("Łańcuch znaków: %s\n", lancuch);
    return 0;
}scanfFunkcja scanf służy do odczytywania danych ze standardowego wejścia. Także używa specyfikatorów formatu do określania typu danych, które mają być odczytane. Przykład użycia:
#include <stdio.h>
int main() {
    int liczba;
    float liczbaZmiennoprzecinkowa;
    char znak;
    char lancuch[100];
    printf("Podaj liczbę całkowitą: ");
    scanf("%d", &liczba);
    printf("Podaj liczbę zmiennoprzecinkową: ");
    scanf("%f", &liczbaZmiennoprzecinkowa);
    printf("Podaj znak: ");
    scanf(" %c", &znak); // Spacja przed %c jest potrzebna, aby zignorować białe znaki
    printf("Podaj łańcuch znaków: ");
    scanf("%s", lancuch);
    printf("Podano liczbę całkowitą: %d\n", liczba);
    printf("Podano liczbę zmiennoprzecinkową: %.2f\n", liczbaZmiennoprzecinkowa);
    printf("Podano znak: %c\n", znak);
    printf("Podano łańcuch znaków: %s\n", lancuch);
    return 0;
}Podczas pracy z wejściem i wyjściem warto obsługiwać błędy, które mogą wystąpić, na przykład w przypadku niepoprawnego formatu danych. Przykład obsługi błędów w C:
#include <stdio.h>
int main() {
    int liczba;
    printf("Podaj liczbę: ");
    if (scanf("%d", &liczba) != 1) {
        fprintf(stderr, "Błąd: nieprawidłowy format liczby.\n");
        return 1;
    }
    printf("Podałeś liczbę: %d\n", liczba);
    return 0;
}Poniżej znajduje się bardziej zaawansowany przykład, który ilustruje użycie różnych typów danych oraz bardziej rozbudowanej logiki:
#include <stdio.h>
#include <string.h>
int main() {
    char imie[50];
    int wiek;
    float wzrost;
    char kraj[50];
    printf("Podaj swoje imię: ");W języku C++ do komunikacji z konsolą używamy biblioteki iostream. Dostarcza ona obiekty takie jak cin, cout, cerr, clog oraz funkcje takie jak getline.
cout z operatorem << służy do wypisywania na standardowe wyjście.cin z operatorem >> wczytuje pojedynczą wartość ze standardowego wejścia.getline(cin, string) pozwala wczytać cały wiersz tekstu, łącznie ze spacjami.
#include <iostream>
#include <string>
using namespace std;
int main() {
    string imie;
    int wiek;
    double wzrost;
    cout << "Podaj swoje imię: ";
    getline(cin, imie);
    cout << "Podaj swój wiek: ";
    cin >> wiek;
    cout << "Podaj swój wzrost (w metrach): ";
    cin >> wzrost;
    cout << "Twoje imię to " << imie << ", masz " << wiek << " lat i masz " << wzrost << " metra wzrostu." << endl;
    return 0;
}W powyższym przykładzie program prosi użytkownika o podanie imienia, wieku i wzrostu, a następnie wyświetla te informacje. Dzięki getline(cin, imie), możemy wczytać pełne imię wraz ze spacjami.
Podczas pracy z wejściem i wyjściem warto również obsługiwać błędy, które mogą wystąpić, na przykład w przypadku niepoprawnego formatu danych. Poniżej znajduje się przykład obsługi błędów w C++:
#include <iostream>
using namespace std;
int main() {
    int liczba;
    cout << "Podaj liczbę: ";
    cin >> liczba;
    if (cin.fail()) {
        cerr << "Błąd: nieprawidłowy format liczby." << endl;
        return 1;
    }
    cout << "Podałeś liczbę: " << liczba << endl;
    return 0;
}W tym przykładzie, jeśli użytkownik poda nieprawidłowy format danych, program wyświetli komunikat o błędzie i zakończy działanie.
Biblioteka iomanip dostarcza manipulatory, które pozwalają formatować wyjście:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
    double liczba = 123.456789;
    cout << "Domyślne wyjście: " << liczba << endl;
    cout << "Wyjście zaokrąglone do 2 miejsc po przecinku: " << fixed << setprecision(2) << liczba << endl;
    cout << "Wyjście w formacie naukowym: " << scientific << liczba << endl;
    return 0;
}Można również używać cin.sync() oraz cin.ignore(), aby radzić sobie z problemami buforowania wejścia:
#include <iostream>
#include <string>
using namespace std;
int main() {
    string imie;
    int wiek;
    cout << "Podaj swój wiek: ";
    cin >> wiek;
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // Ignoruje pozostałe znaki w buforze
    cout << "Podaj swoje imię: ";
    getline(cin, imie);
    cout << "Twoje imię to " << imie << ", masz " << wiek << " lat." << endl;
    return 0;
}Kolorowanie tekstu w konsoli można zrealizować za pomocą kodów ANSI (na systemach uniksowych) lub funkcji konsolowych systemu Windows.
#include <iostream>
using namespace std;
int main() {
    cout << "\033[1;31m"; // Ustawienie koloru na czerwony
    cout << "Czerwony tekst" << endl;
    cout << "\033[0m";    // Resetowanie koloru
    return 0;
}
#include <iostream>
#include <windows.h>
using namespace std;
int main() {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
    cout << "Czerwony tekst" << endl;
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    cout << "Domyślny kolor" << endl;
    return 0;
}W powyższych przykładach pokazano, jak zmieniać kolor tekstu w konsoli, co może być użyteczne do wyróżniania komunikatów lub interfejsów użytkownika.