Jak rozumiem, operator ekstrakcji pomija początkowo białe znaki i zatrzymuje się po napotkaniu białych znaków lub końca strumienia. noskipws można użyć, aby przestać ignorować wiodące spacje.Wpływ noskipws na cin >>
Mam następujący program, w którym użyłem noskipws.
#include <iostream>
using namespace std;
int main()
{
char name[128];
cout<<"Enter a name ";
cin>>noskipws>>name;
cout<<"You entered "<<name<<"\n";
cout<<"Enter another name ";
cin>>name;
cout<<"You entered "<<(int)name[0]<<"\n";
return 0;
}
Moje pytania są następujące:
Jeśli wejdę „John” jako pierwszego wejścia, potem drugi cin >> operacja nie czekać na wejście i nie kopiować niczego do IE docelowego tablica nazw. Spodziewałem się, że drugi ciąg >> przeniesie co najmniej znak nowej linii lub końca strumienia, zamiast tylko ustawić ciąg docelowy, aby był pusty. Dlaczego to się dzieje ?
To samo jest przestrzegane, gdy wpisuję "John Smith" jako dane wejściowe dla pierwszego wyrażenia cin >>. Dlaczego drugie zdanie cin >> nie kopiuje spacji lub "Smitha" do zmiennej docelowej?
Poniżej znajduje się wyjście z programu:
Enter a name John
You entered John
Enter another name You entered 0
Enter a name John Smith
You entered John
Enter another name You entered 0
Dzięki !!!
Mam nadzieję, że wiesz, że program może produkować przepełnienia bufora bardzo łatwo. W kodzie produkcyjnym nie powinieneś używać 'std :: cin' do zapisu w tablicy char. Zamiast tego użyj 'std :: string'. – smerlin
To prawda. Powyższy kod służy wyłącznie do celów ilustracyjnych. Używanie cin.width lub cin.getline pozwala uniknąć niektórych problemów z przepełnieniem, ale jak już wspomniano, std :: string byłoby najlepsze. Podałem powyższy przykładowy kod tylko po to, aby pokazać, o co chciałem zapytać. –