Использование getline (cin, s) после cin
Мне нужна следующая программа, чтобы взять всю строку ввода пользователя и поместить ее в имена строк:
Если команда cin >> number перед командой getline() (что я предполагаю, это проблема), она не позволит мне вводить имена. Почему?
Я слышал что-то о команде cin.clear() , но я понятия не имею, как это работает или почему это даже необходимо.
12 ответов
В приведенном выше коде этот бит.
. проверяет остальную строку ввода после того, как число содержит только пробелы.
Почему бы просто не использовать ignore?
Это довольно многословно, поэтому использование ignore в потоке после >> x является часто рекомендуемым альтернативным способом отбрасывания содержимого до следующей новой строки, но он рискует выбросить не-пробельный контент и при этом игнорировать поврежденные данные в файле. Вы можете или не должны заботиться, в зависимости от того, доверено ли содержимое файла, насколько важно избегать обработки поврежденных данных и т.д.
Итак, когда вы будете использовать clear и игнорировать?
Итак, std::cin.clear() (и std::cin.igore() ) для этого не требуется, но полезно для удаления состояния ошибки. Например, если вы хотите дать пользователю много шансов ввести действительный номер.
Не может быть проще с skipws или схожим?
Другая простая, но наполовину испеченная альтернатива ignore для вашего первоначального требования — использовать std::skipws , чтобы пропустить любое количество пробелов перед чтением строк.
. но если он вводится как «1E6» (например, какой-то ученый пытается ввести 1 000 000, но С++ поддерживает только эту нотацию для чисел с плавающей запятой) не согласится с тем, что вы закончите с помощью number set до 1 и E6 считать первым значением name . Отдельно, если у вас есть действительное число, за которым следуют одна или несколько пустых строк, эти строки будут игнорироваться.
Почему getline не работает после cin c
Return to Topic Menu | Computer Science Main Page | MathBits.com | Terms of Use
| Problems with getline(cin, name); |
Since getline does not ignore leading whitespace characters, you should take special care when using it in conjunction with cin >> .
The problem: cin>> leaves the newline character (\n) in the iostream. If getline is used after cin>> , the getline sees this newline character as leading whitespace, thinks it is finished and stops reading any further.
Program fragment with problem:
apstring name;
int age;
Enter your age 5
Enter your full name Ben Bunny
, you are 5
The yellow wave is the iostream. The cin statement uses the 5 and leaves the \n in the stream as garbage. The cin statement will NOT read (or "grab") \n. The cin also ignores \n when reading data. The getline, on the other hand, reads and "grabs" \n. So, when it sees the \n LEFT from cin, it "grabs" the \n and thinks it is finished reading.
Don’t be a dumb bunny and fall for this trap.
Ways to fix the problem:
Consume the trailing newline character from the cin>> before calling getline, by "grabbing" it and putting it into a "dummy" variable.
You will see me using this method throughout the course.
apstring dummy;
getline(cin, dummy);
Program fragment with correction:
apstring name, dummy;
int age;
cout<<"Enter your age";
cin>>age;
getline(cin,dummy);
cout<<"Enter your full name";
getline(cin, name);
Enter your age 5
Enter your full name Ben Bunny
Ben Bunny, you are 5