Wczytywanie łańcuchów do tablicy - wprowadzanie zbyt długich łańcuchów

0

Mam taie coś

#include <iostream>
#include <cstring>

int main(void)
{
    char txt[10];
    
    std::cout << sizeof(txt) << "    " << strlen(txt) << std::endl;
    std::cout << "Podaj tekst: ";
    std::cin >> txt;
    std::cout << "Napisales: " << txt << std::endl;
    std::cout << sizeof(txt) << "    " << strlen(txt);
}

jak przypisuje tablicy txt łańcuch dłuższy niż 9 znaków to zgłasza błąd że jest za długi, czyli prawidłowo.
ale jak podczas działania programu wprowadzę tekst dłuższy niż 9 znaków, to pobiera i wypisuje to prawidłowo.
Dlaczego tak jest??

0

W C/C++ nie ma mechanizmu kontroli wychodzenia poza zakres tablicy, ergo wpisując dłuższy łańcuch znaków nadpisujesz pamięć znajdującą się bezpośrednio za tablicą.

0

Czyli muszę sam dbać, o to żeby użytkownik nie przekroczył rozmiar tablicy?? np.używając fgets gdzie podaje ile znaków maksymalnie ma pobrać

1
#include <iomanip>

std::cin >> std::setw(10) >> txt;
0

a jak mam takie coś

#include <iostream>

int main(void)
{
    const int ROZMIAR = 10;
    
    char tab[ROZMIAR];
    char tab2[ROZMIAR];
    
    std::cin.getline(tab, ROZMIAR);
    std::cout << tab << std::endl;
    std::cin.getline(tab2, ROZMIAR);
    std::cout << tab2;
}

jak wpisze za długi wyraz to program pobierze tyle ile może wyświetli, a drugi getline nie działa program sie kończy.
a jak mam tak

std::cin >> tab;
std::cout << tab << std::endl;
std::cin >> tab2;
std::cout << tab2;

i podam dwa wyrazy od razu, to drugi zostaje w buforze i zostaje pobrany przez drugi cin/
jeśli getline zastąpię get, jak wpisze więcej niz 10 znaków to te ponad 10 zostaja pobrane przez drugie wywołanie

Dlaczego getline się wiesza, jak podam za długi wyraz??

0
  1. "Wiesza się" - oznacza wciąż działa ale nie reaguje na polecenia, w opisanym przypadku zwyczajnie "kończy się", ewentualnie "wywala się"
  2. W niektórych kompilatorach jeżeli podałeś za dużo to ustawiany jest failbit, dopóki jest ustawiony cały cin "nie działa", zdjęcie failbit - cin.clear()

1 użytkowników online, w tym zalogowanych: 0, gości: 1