Как остановить сканирование данных на клавиатуре при нажатии CTRL+D

Я начинающий программист. У меня есть задание, и у меня есть некоторые проблемы по этому поводу. В первую очередь моя задача:

«Предположим, что вы сканируете вводимый текст на турецком языке посимвольно с клавиатуры, которую вы можете считать устройством ввода по умолчанию, до тех пор, пока не будет нажата CTRL-D. Предполагается, что вы пропускаете знаки пунктуации, а также пробелы. . Ваша программа будет отображать частоты букв и цифр всякий раз, когда процесс сканирования будет завершен. Вам необходимо обсудить структуру данных, а также решение блок-схемы и передать их вместе с вашим кодом».

Я провел небольшое исследование и обнаружил, что команда CTRL + D соответствует EOF. Я написал свой код, но он не работает так, как я хочу. Вот мой код.

#include <stdio.h>
#include "stdlib.h"
#include <locale.h>

int main()
{
    setlocale(LC_ALL, "Turkish");    

    char message[1000] = { ' ' };
    char ch;
    int i = 0;

    printf("Please enter your message: ");

    while (ch = getchar() != EOF )
    {
        message[i] = ch;
        i++;
    }

    for (i; i >= 0; i--)
    {
        printf("%c", message[i]);
    }

    printf("\n\n");

    system("PAUSE");
    return 0;
}

Когда я его запускаю, я что-то пишу и нажимаю ctrl+d, но как видите на картинке ничего не происходит. Просто пишет ^D. Спасибо за помощь.

Изображение 1


person root_roxox    schedule 20.04.2020    source источник


Ответы (1)


Ctrl-D соответствует целочисленному символьному литералу '\4' в C, поскольку A=1, B=2, C=3, D=4.

На скриншоте видно, что вы программируете в Windows, поэтому то, что вы читали о том, что Ctrl-D совпадает с EOF, не применимо (это касается Unix/Linux/Mac).

Чтобы что-то исправить, вам нужно прочитать до '\4' (или только 4; они эквивалентны):

while ((ch = getchar()) != '\4')
{
    message[i] = ch;
    i++;
}

Обратите внимание, что вам по-прежнему нужно будет нажать клавишу Enter или Return, чтобы строка текста была принята, то есть вы можете ввести hello world^D what? i can still type? перед нажатием Enter отправить текст в вашу программу. Однако ваша программа перестанет читать на символе ^D, в результате чего будет напечатано сообщение hello world.

В будущем вы можете использовать что-то вроде printf("%d %c\n", message[i], message[i]); в цикле для печати списка прочитанных вами значений байтов.

person MemReflect    schedule 20.04.2020
comment
Большое спасибо, но когда я это сделал, я получаю такой вывод. imgur.com/a/Q8eyUIb - person root_roxox; 20.04.2020
comment
Если вы попробуете использовать обычные символы ASCII, вы обнаружите, что это работает. Эта проблема со странными символами, выводящимися на консоль, связана с локалью вашей системы и шрифтом, который использует консоль Windows. Вы можете найти все виды вопросов на Stack Overflow и других сайтах о выводе Unicode в консоли Windows. Возможное исправление: во время работы вашей программы вы также можете щелкнуть правой кнопкой мыши строку заголовка и выбрать «Свойства», затем выбрать шрифт Lucida Console, если он еще не выбран, что может помочь или не помочь с проблемой вывода. - person MemReflect; 20.04.2020
comment
Я сделал это, но у меня все еще есть эта проблема .. Можете ли вы сказать мне, что я должен сделать, чтобы предотвратить это? - person root_roxox; 20.04.2020
comment
К сожалению, насколько я знаю, больше нечего попробовать. Консоль Windows очень ограничена. Еще одним возможным решением может быть вызов _setmbcp(857) после строки setlocale (857 — это кодовая страница OEM, используемая для турецкого языка в консоли Windows; не забудьте #include <mbctype.h>). Я не программирую под Windows, поэтому, боюсь, больше ничего не могу вам сказать. Основная проблема заключается в том, что программы Windows по умолчанию используют кодовую страницу ANSI, в то время как консольные программы используют кодовую страницу OEM, и setlocale() не обязательно работает для изменения кодовой страницы OEM. Это проблема Windows, а не C. :( - person MemReflect; 20.04.2020