Вопрос по manipulators, c++, stream – Влияние noskipws на cin >>

6

Как я понимаю, оператор извлечения пропускает пробел в начале и останавливается при встрече с пробелом или концом потока. 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;
}

Мои запросы:

If I enter "John" as the first input, then the second cin>> operation does not wait for input and does not copy anything to the destination i.e. the name array. I expected second cin>> to transfer at-least a newline or end of stream, instead of just setting the destination string to empty. Why is this happening ?

The same thing is observed when I enter "John Smith" as the input for first cin>> statement. Why doesn't the second cin>> statement copy the space or "Smith" to the destination variable ?

Ниже приводится вывод программы:

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

Спасибо!!!

Я надеюсь, вы знаете, что ваша программа может очень легко вызвать переполнение буфера. В производственном коде вы не должны использоватьstd::cin записать в массив символов. Использоватьstd::string вместо. smerlin
Это правда. Приведенный выше код был только для иллюстрации. Использование cin.width или cin.getline может избежать некоторых проблем переполнения, но, как вы упомянули, std :: string было бы лучше. Я дал приведенный выше пример кода, чтобы показать, что я пытался спросить. Achint Mehta

Ваш Ответ

1   ответ
10

Основной алгоритм для>> строки это:

skip whitespace
read and extract until next whitespace

Если вы используетеnoskipws, то первый шаг пропускается. После первого чтения вы позиционируете себя на пустом месте, поэтому следующее (и все последующее) чтение немедленно остановится, ничего не извлекая.

>> к строке никогда не вставит пробел в строку. В целом, используя>> сnoskipws проблематично, поскольку пробел всегда является разделителем для>>; может иметь смысл использовать его пунктуально, но обычно его следует сбрасывать сразу после использования. (Один раз, когда это может иметь смысл, это при использовании>> кchar, В этом случае потокalways извлекает один символ.)

Хорошо понял вашу точку зрения. Но я все еще не понимаю, почему «Джон Смит» ничего не сказал. вызвать & gt; & gt; оператор для копирования & quot; Смита & quot; во второй операции ввода. Почему «Смит» полностью исчезают из входного потока, и даже тогда вторая операция cin не ожидала ввода. Achint Mehta
@AchintMehta, потому что следующий символ, который нужно прочитать, это пробел, а неS в"Smith", Вы сказали ему не пропускать пробелы, так что это не так. Затем он вводит до, но не включает следующий пробел, который является немедленным."Smith" не исчезает, вы просто не читаете его. И вы не можете читать это с>>, Кроме>> вchar, так как все остальные>> остановится на первом пробеле, ничего не извлекая и не продвигая позицию ввода.

Похожие вопросы