Влияние noskipws на cin>>
Как я понимаю, оператор извлечения пропускает пробел в начале и останавливается при обнаружении пробела или конца потока. noskipws можно использовать, чтобы перестать игнорировать начальные пробелы.
У меня есть следующая программа, где я использовал 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;
}
Мои запросы:
Если я введу "John" в качестве первого ввода, то вторая операция cin >> не ожидает ввода и ничего не копирует в место назначения, то есть в массив имен. Я ожидал, что второй cin >> передаст хотя бы новую строку или конец потока, вместо того, чтобы просто установить строку назначения как пустую. Почему это происходит?
То же самое наблюдается, когда я ввожу "Джон Смит" в качестве ввода для первого оператора cin >>. Почему второй оператор cin >> не копирует пробел или "Smith" в целевую переменную?
Ниже приводится вывод программы:
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
Спасибо!!!
1 ответ
Основной алгоритм для >>
строки это:
skip whitespace
read and extract until next whitespace
Если вы используете noskipws
, то первый шаг пропускается. После первого чтения вы позиционируете себя на пустом месте, поэтому следующее (и все последующее) чтение немедленно остановится, ничего не извлекая.
>>
к строке никогда не поместит пробел в строку. В целом, используя >>
с noskipws
проблематично, поскольку пробел всегда является разделителем для >>
; может иметь смысл использовать его пунктуально, но обычно его следует сбрасывать сразу после использования. (Один раз, когда это может иметь смысл, это при использовании >>
к char
, В этом случае поток всегда извлекает один символ.)