Вопрос:
Извините, но я совершенно новый для 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)) { … }