Влияние 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;
}

Мои запросы:

  1. Если я введу "John" в качестве первого ввода, то вторая операция cin >> не ожидает ввода и ничего не копирует в место назначения, то есть в массив имен. Я ожидал, что второй cin >> передаст хотя бы новую строку или конец потока, вместо того, чтобы просто установить строку назначения как пустую. Почему это происходит?

  2. То же самое наблюдается, когда я ввожу "Джон Смит" в качестве ввода для первого оператора 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, В этом случае поток всегда извлекает один символ.)

Другие вопросы по тегам