С++ метод getline не работает

Вопрос: Извините, но я совершенно новый для C++, но не для программирования вообще. Поэтому я попытался сделать простое шифрование/дешифрование. Однако, когда я добавил модификацию к моему предыдущему коду (поэтому нет двух программ для шифрования и дешифрования), я обнаружил, что метод 'getline()' больше не работает. Вместо этого он просто игнорирует это при запуске кода. Здесь код:

Вопрос:

Извините, но я совершенно новый для C++, но не для программирования вообще. Поэтому я попытался сделать простое шифрование/дешифрование. Однако, когда я добавил модификацию к моему предыдущему коду (поэтому нет двух программ для шифрования и дешифрования), я обнаружил, что метод ‘getline()’ больше не работает. Вместо этого он просто игнорирует это при запуске кода. Здесь код:

int main(){ std::string string; int op = 1; //Either Positive or Negative srand(256); std::cout << «Enter the operation: » << std::endl; std::cin >> op; std::cout << «Enter the string: » << std::endl; std::getline(std::cin, string); //This is the like that ignored for(int i=0; i < string.length(); i++){ string[i] += rand()*op; //If Positive will encrypt if negative then decrypt } std::cout << string << std::endl; std::getchar(); //A Pause return 0; } Лучший ответ:

Это потому, что std::cin >> op; оставляет в вашем коде висящий n, и это первое, что читает getline. Поскольку getline перестает читать, как только находит символ новой строки, функция возвращается немедленно и больше ничего не читает. Вы должны игнорировать этот символ, например, используя cin.ignore(std::numeric_limits<std::streamsize>::max(), ‘n’); ( std::numeric_limits определяется в заголовке <limits>), как указано в cppreference.

Ответ №1

Это связано с тем, что у вас все еще есть символ новой строки в буфере, который заставляет getline() останавливать чтение, как только он встретится с ним.

Используйте cin.ignore() чтобы игнорировать символ новой строки из буфера. Это будет сделано в вашем случае.

В общем случае, если вы хотите удалить символы из своего буфера до определенного символа, используйте:

cin.ignore ( std::numeric_limits<std::streamsize>::max(), ch ) Ответ №2

Использование:

cin.ignore( std::numeric_limits<std::streamsize>::max(), ‘n’ );

есть новые строки из предыдущего ввода std::cin >> op;

header – <limits>

Другой способ:

while (std::getline(std::cin, str)) //don’t use string if (str != «») { //Something good received break; } Ответ №3

Как уже было сказано, форматированный вход (используя in >> value) начинает пропускать пробел abd stop, когда они будут выполнены. Обычно это приводит к тому, что некоторые пробелы пробегают. При переключении между форматированным и неформатированным входом вы обычно хотите избавиться от ведущего пространства. Это можно легко сделать с помощью манипулятора std::ws:

if (std::getline(std::cin >> std::ws, line)) { … }

Оцените статью
Добавить комментарий