cin >> char a ciag znakow

0
cout << "Podaj litere \"#\" konczy wpisywanie: ";
char ch;
int count = 0;

cin >> ch;

while(ch != '#')
{
    cout << ch;
    ++count;

    cin >> ch;
}

cout << endl << endl << "Podano " << count << " liter.";

Mając taki kod trochę nie czaję jak on działa kiedy wpisuję z klawiatury np "abcdefgh" (enter)
przecież nie da się do jednej zmiennej char wpisać całego ciągu, a pojedyńczy znak..

Tutaj jednak działa wpisanie od razu całego słowa tak jakbym za każdym znakiem klikał enter, jak to tak działa? W książe jakoś Prata tego nie wytlumaczył na razie ;/

W przypadku cin.get(ch) tak samo.

1

cin buforuje znaki, czyli wypełnia bufor do napotkanego entera. po czym dopiero zaczyna cokolwiek zwracać.
Czyli instrukcja w wierszu 5 wczyta pierwszy znak dopiero jak wprowadzisz cały wiersz.

Ja napisałbym ten kod inaczej:

cout << "Podaj litere \"#\" konczy wpisywanie: ";
int count = 0;
for(char ch;(cin>>ch)&&(ch!='#');++count) cout<<ch;
cout<<"Podano "<<count<<" znaków (nie licząc białych znaków)."<<endl;
0

@_13th_Dragon: Nie bardzo czaję to buforowanie, wpisując od razu ciąg znaków a dopiero potem enter wygląda to jakbym wpisywał stringa albo znaki do tablicy char niż do jednej zmiennej typu char.

Poza tym to przykład z książki gdzie gość pisze o pętli while dlatego tak.

Drugie pytanie, kod z książki

count = 0;
int lol;

while((lol = cin.get()) != EOF)
{
    cout.put(char(lol));
    ++count;
}

cout << endl << endl << "Podano " << count << " liter.";

Gość pokazuje put() i sprawdzanie symulacji końca pliku z klawiatury.
Nie chce mi się to kompilować bo eof nie jest declared in this scope więc zaczynam w te książkę powątpiewać, pierwszy raz kod z książki mi się nie skompilował.

Poza tym tu lol jest typu int a mogę normalnie w jego miejsce wpisywać zdania.

0

A co tu czaić, wpisałeś litery AB chcesz aby twój program już dostał te litery? Doprawdy? A jak naciśniesz dwa razy <backspace> i wpiszesz XY co twój program ma robić z tym fantem?
Więc dopóki nie wpiszesz całego wiersza i nie zatwierdzisz przez <Enter> nie ma gwarancji że nie zmienisz zdania.
A co za tym idzie cin zaczyna "obrabiać" tylko zatwierdzony wiersz.

0

chcesz reagował na każdy znak wprowadzony z klawiatury - to nie jest ustandaryzowane w językach C/C++ i zależne jest od używanego terminala. Większoś z nich buforuje wprowadzane dane tak jak opisano Ci wcześniej. Możesz skorzysta z bibliotek zewnętrznych.

0

Bez buforowania mozesz czytac np. przy pomocy ncurses getch:
https://stackoverflow.com/a/905107

0

Czyli wpisując ciąg znaków od razu pokazuje ile razy pętla się wykona? Pamiętam kiedyś, że wpisywało się znaki pojedynczo, a teraz widzę, że mogę wszystkie od razu napisać jako jedno słowo.

1

Wszystkie odpowiedzi są poprawne, ale ja też nie zrozumiałem od razu jak to działa. A robi to tak:

Jeżeli wpiszesz ciąg "abc<enter>", to kolejne przejścia pętli będą takie:

  1. Wypisuje a i dostaje z cin b
  2. Wypisuje b i dostaje z cin c
  3. Wypisuje c i jako że wyczerpana jest zawartość bufora - czeka na wpisanie

Po prostu pętla się kręci wybierając kolejne znaki z bufora.

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