C - Условие размера буфера не прерывается, пока цикл - PullRequest
0 голосов
/ 09 июля 2020

ОБНОВЛЕНИЕ: Хорошо, я ошибаюсь в этом. Причина, по которой я не получаю желаемого результата, заключается в том, что я читаю с терминала и жду нажатия клавиши ввода, прежде чем программа продолжит выполнение. Что мне действительно нужно сделать, так это запрограммировать «экран» или окно x11 для чтения входных данных в реальном времени. Поэтому мой вопрос теперь излишний. Спасибо за все предложения.

Есть ли лучший способ запрограммировать это, что позволило бы мне фиксировать keyPress время? И почему BUFFERSIZE условно в то время как l oop не выходит из l oop?

#define BUFFERSIZE 100 

int main(void) {

    int terminalInput;
    int keyPress = 0;
    int inputArrayBuffer[BUFFERSIZE];
    int bufferExceptionFlag = 0;

    printf("\n\t\t\t->");                                   /* Prompt */

    while((terminalInput = getchar()) != '\n' && keyPress < BUFFERSIZE) {
        inputArrayBuffer[keyPress] = terminalInput;
        ++keyPress;

        if (keyPress >= BUFFERSIZE) {
            bufferExceptionFlag = 1;
        }
    }
    return 0;
}

1 Ответ

0 голосов
/ 09 июля 2020

Несколько вопросов. Во-первых, ваш inputArrayBuffer должен быть массивом char, а не массивом int. Во-вторых, есть стандартные C библиотеки, которые включают в себя то, что вы хотите сделать.

Вопрос 1: «Есть ли лучший способ запрограммировать это, которое позволило бы мне фиксировать время нажатия клавиш?"

Да. Для чтения stdin до тех пор, пока не будет встречена новая строка или максимальная длина, функция fgets из stdio.h работает нормально (хотя могут существовать альтернативы). Что-то вроде

fgets(inputArrayBuffer, BUFFERSIZE, stdin)

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

keyPress = strlen(inputArrayBuffer) - 1; // -1 because the newline '\n' is included in strlen if you use fgets

Если вы должны захватить один символ за раз, тогда исходный код, который вы предложили, должен работать, просто обязательно определите inputArrayBuffer как char inputArrayBuffer[BUFFERSIZE];

Вопрос 2: «И почему условие BUFFERSIZE в то время как l oop не выходит из l oop?»

Это определенно должно выходить из l oop. Но не путайте bufferExceptionFlag, равное 1, со значением, означающим, что keyPress < BUFFERSIZE не привело к поломке l oop. Ясно, что когда вы ++keyPress внутри l oop, если keyPress имеет значение 99, тогда оно станет 100, что приведет к установке bufferExceptionFlag. Однако на следующей l oop итерации keyPress < BUFFERSIZE будет ложным, а l oop сломается.

На мой взгляд, это более простое и подходящее решение.

#include <stdio.h>
#include <string.h>
#define BUFFERSIZE 100

int main(void) {
    char inputArrayBuffer[BUFFERSIZE];
    unsigned long keyPress = 0;
    printf("\n\t\t\t->");                                   /* Prompt */
    fgets(inputArrayBuffer, BUFFERSIZE, stdin);
    keyPress = strlen(inputArrayBuffer) - 1; // -1 because the newline '\n' is included in strlen if you use fgets
    printf("User entered: %s\n", inputArrayBuffer);
    printf("Input length: %lu\n", keyPress);
    return 0;
}

Обратите внимание, что fgets включает символ новой строки в считываемой строке. Чтобы удалить этого символа, вы можете сделать что-то вроде inputArrayBuffer[keyPress] = '\0';

...