разделитель на getline () не работает должным образом - PullRequest
0 голосов
/ 30 августа 2018

У меня есть простой код, который получает имя пользователя в виде массива с публичной функцией getline (). когда он достигает char '$', я хочу прекратить получать ввод от пользователя и перейти к следующей строке. Но сразу после достижения char '$' (мой разделитель) он игнорирует строку 5 и запускает строку 6, и я не знаю почему! !!

#include <iostream>     // std::cin, std::cout

int main () {

char name[256], title[256];
std::cout << "Please, enter your name: ";
std::cin.getline (name,256,'$');                         //Line 3
std::cout << "Please, enter your favourite movie: ";
std::cin.getline (title,256);                            // Line 5
std::cout << name << "'s favourite movie is " << title;  // Line 6
return 0;
}

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Кажется, работает так:

#include <iostream>     // std::cin, std::cout

int main () {

char name[256], title[256], endOfLine[2];
std::cout << "Please, enter your name: ";
std::cin.getline (name,256,'$');                         //Line 3
std::cin.getline(endOfLine, 1);
std::cout << "Please, enter your favourite movie: ";
std::cin.getline (title,256);                            // Line 5
std::cout << name << "'s favourite movie is " << title;  // Line 6
return 0;
}
0 голосов
/ 30 августа 2018

Позвольте мне предположить, что ваш вклад выглядит так:

> ./myProg
Please, enter your name: noob$
lease, enter your favourite movie: Top Gun
noob's favourite movie is 
>

Здесь мы видим, что вы ввели: noob$<return> с последующим Top Gun<return>.

Проблема в том, что компьютер видит следующее:

noob$\nTop Gun\n

OK. Итак, что происходит в коде.

std::cin.getline (name,256,'$');  // This reads upto the '$' and throws it away.

Итак, ваш поток ввода теперь выглядит так:

\nTop Gun\n

Обратите внимание на '\ n' в начале потока.
Теперь ваша следующая строка:

std::cin.getline (title,256);  // This reads the next line.
                               // But the next line ends at the next new line
                               // which is the next character on the input stream.
                               // So title will be empty.

Чтобы исправить это, вам нужно прочитать эту пустую строку.
Лучший способ исправить это - не требовать, чтобы имя заканчивалось на '$'. Пользовательский ввод, как правило, лучше сделать строкой за раз. Когда пользователь нажимает return, буфер очищается, и поток фактически начинает работать. Программа ничего не делает (кроме ожидания) до тех пор, пока этот буфер не будет сброшен в поток (это обычно по возвращении, но может произойти, если вы просто наберете много).

0 голосов
/ 30 августа 2018

Для решения вашей проблемы вы можете использовать следующее решение:

.....getline(title,256,'$')
//                      ^
//                      |
// this is where the delimiter goes in your function call
...