Отношения между оболочкой и C-программой [закрыто]

Я написал следующий код как часть упражнения в первой главе K & R. Код заменяет табуляцию и обратную косую черту, как и ожидалось, но он не заменяет символы возврата на \ b. Вот код:

#include <stdio.h>


int main(void)
{
    int c;

    while((c = getchar()) != EOF)
    {
        if (c == '\t')
        {
            putchar('\\');
            putchar('t');
        }

        if (c == '\b')
        {
            //putchar('\\');
            //putchar('b');
            printf("\\b");
        }

        if (c == '\\')
        {
            putchar('\\');
            putchar('\\');
        }

        if (c != '\t' && c != '\b' && c != '\\')
        {
            putchar(c);
        }
    }


    return 0;
}

Я просмотрел переполнение стека. Ответы на этот вопрос говорят о том, что оболочка потребляет backspace, в результате тот код, который я пишу, никогда не видит возврата. Это подводит меня к моему вопросу: что происходит с вводом, который я предоставляю на клавиатуре? Я предполагаю, что это становится частью потока stdin. Очевидно, что не все символы, которые я ввожу, попадают в мой код. Может кто-нибудь объяснить, какая обработка происходит между моими нажатиями клавиш и обработкой этого ввода моим кодом? Кроме того, есть ли способ для моего кода для чтения буфера стандартного ввода перед этой обработкой?

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

4 голоса | спросил BruceM 5 J000000Wednesday17 2017, 22:27:10

2 ответа


0

Когда getchar() читает с интерактивной консоли, функция не вернется, пока после не нажмете клавиша ВВОД. Затем он вернется с первым введенным символом и сразу же вернется к каждому последующему введенному символу, вплоть до символа новой строки.

Если вы нажали клавишу «Backspace», «Delete» или клавишу со стрелкой до нажатия клавиши «ENTER», терминал обрабатывает эти нажатия клавиш и отправляет «окончательный результат» только при нажатии клавиши «ENTER».

Если бы вы читали из перенаправленного файла (то есть вы называли вашу программу ./myprog < input_file) или передавали по конвейеру выходные данные из другой программы ( т.е. ./otherprog | ./myprog), тогда getchar вернется сразу для каждого символа, и вы увидите все, включая управляющие символы и отдельные байты UTF-8.

ответил dbush 5 J000000Wednesday17 2017, 22:33:04
0

Это потому, что символ возврата не попадает в getchar при стандартном вводе. Когда вы набираете backspace, он просто отменяет введенный вами символ.

Если вам удастся создать текстовый файл с символами возврата и передать его в свою программу, это будет работать.

ответил Jean-François Fabre 5 J000000Wednesday17 2017, 22:33:24

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132