как C читать символ и разрыв строки, когда я использую цикл? - PullRequest
0 голосов
/ 21 сентября 2019

Когда я пробую цикл, я нахожу некоторые сомнения.

  1. Когда я нажимаю «Enter» в первый раз, он печатает две пустые строки, во второй раз он печатает еще двепустые строки и выполнение после оператора.

  2. Когда я нажимаю «Enter», затем «#» и снова «Enter», это не заканчивается.

Интересно, почему?

while((ch = getchar()) != '#')
{
    putchar(ch);
    while(getchar() != '\n')
            ;
    printf("\nEnter next word.");
}

Я хочу понять, как это работает.

1 Ответ

0 голосов
/ 21 сентября 2019

Как предлагается в комментариях, я рекомендую использовать отладчик для пошагового выполнения этой программы.Наблюдение за тем, что происходит, строка за строкой - лучший способ понять все, что происходит, и улучшить свои навыки кодирования.

Тем не менее, это поможет получить некоторое представление о том, что getchar делает по умолчанию, когда у вас естьинтерактивная программа на большинстве систем.Когда вы в первый раз вызываете getchar, он, в свою очередь, вызовет функцию операционной системы более низкого уровня, которая получит вход от стандартного входа (stdin).Например, в Linux функция низкого уровня - это read, которая будет получать входные данные от терминала.

В большинстве систем по умолчанию происходит то, что функция низкого уровня не будет возвращаться, пока не будет нажата кнопка ввода.Все, что было введено, будет возвращено обратно в терминал / консоль, так что вы увидите, что вы печатаете.

Как только вы нажмете ввод, getchar вернет первый символ, относящийся к тому, что вы набрали.Если вы наберете более одного символа, ваш следующий вызов getchar немедленно вернется со следующим набранным вами чатом.Обратите внимание, что в Linux, когда вы нажимаете Enter, это будет похоже на то, как вы набрали '\n', однако в Windows окончания строк различны, поэтому это будет похоже на '\r' затем '\n'.

Так что причина, по которой высм. две пустые строки, когда вы в первый раз нажмете ввод, потому что первая отражается вашей низкоуровневой функцией os, а вторая - вашим putchar.getchar вызывается снова, и ваша третья пустая строка исходит от эха.Четвёртое происходит от вашего printf.

Я оставлю вторую часть для вас, чтобы выяснить самостоятельно.

...