C#, пропуск Console.ReadLine(); Консоль.Прочитать(); пока в цикле

Если я запускаю свой код и ввожу правильное значение в первый раз, программа работает нормально и выполняет свою работу, но если я ввожу неверный путь и позволяю циклу вращаться во второй раз, он пропускает path=Console.ReadLine();, но не пропускает j = (char)Console.Read(); то же самое сохраняется в оставшемся коде .

do
{
    Console.WriteLine("Insert path:");
    path = Console.ReadLine();

    temp1 = CheckPath(path); //checks if inserted value is legit
    if (temp1 == false) 
    { 
        Console.WriteLine("\nDo you want to skip this step(by default directory will be set to Desktop)? Y/N ");
        j = (char)Console.Read(); 
        if (j.Equals('Y') || j.Equals('y')) 
        {
            path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
            temp1 = true; 
        }
    }
    //User inputs y/Y loop will end and exit with either path chosen by user or with desktop path
} while (!temp1);

path = Console.ReadLine(); пропускается, если пользователь не вводит правильный путь. Искал решение со вчерашнего дня, и мне не удалось найти идентичную проблему в Интернете. Ссылка на полный код: Код.


person Community    schedule 17.10.2014    source источник
comment
Вы прошли через это? Вероятно, это просто порядок, в котором вы назначаете значения bool и path. Каждый раз, когда они оцениваются, наведите на них курсор и проверьте, соответствует ли это значение, которое вы ожидаете увидеть.   -  person    schedule 17.10.2014
comment
@DeeMac Я отлаживал этот код как сумасшедший. Он делает то, что указано в исходном сообщении.   -  person    schedule 17.10.2014
comment
очевидно, Consol.Read() добавляет возврат каретки к вводу, и этот возврат каретки заставляет Console.ReadLine() пропустить проверку stackoverflow.com/questions/5162670/   -  person SeraphimFoA    schedule 17.10.2014
comment
@SeraphimFoA Позвольте мне попробовать это прямо сейчас.   -  person    schedule 17.10.2014


Ответы (2)


Вызов не пропускается — проблема в том, что Console.Read() вернется только после того, как пользователь нажмет «Ввод», хотя он использует только первый прочитанный символ. Итак, предположим, что (при появлении запроса о пропуске) пользователь вводит:

Nfoo

а затем возвращается... значение path на следующей итерации будет foo.

Самое простое решение, вероятно, состоит в том, чтобы преобразовать ваш вызов Console.Read() в Console.ReadLine() и просто обработать ситуацию, когда пользователь вводит более одного символа.

person Jon Skeet    schedule 17.10.2014
comment
j = (char)Console.Read(); не пропускается. Пока путь = Console.ReadLine(); является. - person ; 17.10.2014
comment
И это было из-за Console.Read(); как только я преобразовал его в Console.ReadLine(); это сработало. Спасибо. Пожалуйста, объясните, почему так? - person ; 17.10.2014
comment
@Carl: я объяснил это в ответе ... Console.Read не завершится, пока пользователь не нажмет return. - person Jon Skeet; 17.10.2014
comment
Извините за непонимание, но я пытаюсь узнать как можно больше. Поэтому, пожалуйста, уточните, так как я на самом деле нажал клавишу возврата (return=enter?). - person ; 17.10.2014
comment
@Carl: Вы нажимаете ввод, но Console.Read() не использует это - он использует только один символ ввода. Таким образом, если вы наберете "foo<return>", он будет потреблять f, а затем следующий вызов Console.ReadLine() будет потреблять oo‹return›. - person Jon Skeet; 17.10.2014

Гораздо полезнее использовать для этого Console.ReadKey - он прочитает ровно одну клавишу и не потребует от вас нажатия ввода.

person Luaan    schedule 17.10.2014