Что мне делать, чтобы программа не запускала oop самостоятельно через весь буфер клавиатуры? Я не очень хорошо знаю, как работает низкоуровневая функция read (), но очевидно, что это похоже на отдельный неблокирующий поток, который я не могу заставить остановить его, чтобы получить больше, чем я хочу.
Например, в приведенном ниже коде я просто хочу заставить пользователя ввести 4 символа с клавиатуры в терминале. Но из-за перевода строки '\ n', даже когда введено "123" + [ввод], ret = read (0, buffer, 4) возвращает 4, а не 3 ... таким образом, условие while l oop проверяется и программа входит в l oop, хотя этого не должно быть ... Кроме того, ret все равно получает значение 4 даже при вводе "1234" + [enter] ... но на этот раз встречается вторая проблема, while l oop выполняется дважды, таким образом, запрашивая две последовательные строки «Введите текст:» ...
Не могли бы вы помочь решить, как правильно организовать код, чтобы избежать дальнейшей обработки чтения буфера клавиатуры? а как побороть "123" + [ввод] = 4 символа неправильная оценка? Thnx
ПРИМЕЧАНИЕ: если вы наблюдаете выходное изображение, обратите внимание, что при вводе трех символов, таких как «123» и «456», они печатаются повторно, что указывает на то, что введено внутри while-l oop (хотя, не должно есть) .. и вторая проблема может наблюдаться при вводе "1234" и "7898" ... они все еще перепечатываются, показывая, что мы внутри l oop - это нормально ... но не должно быть двойных напечатаны подсказки «Введите текст:» ... они должны быть отдельными строками ... показывает, что функция чтения каким-то образом повторяется еще раз по l oop, для дополнительного символа перевода строки - [клавиша ввода] ... И когда введено несколько символов, l oop не должен запускаться для каждого ввода длиной 4 символа несколько раз.
Это код:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define BUFSIZE 1000
unsigned char end=0;
int main(int argc, char const *argv[])
{
char *buffer=(char*)malloc(sizeof(char)*BUFSIZE);
char inp,*bptr=buffer;
int ret;
for(;;)
{
printf("Enter text : \n");
/* READ automatically enters this loop even when bytes read are
more than 4, and it does it for each 4 next character in keyboard buffer
*/
while((ret=read(0,buffer,4))==4)
{
if( !strcmp(bptr,"1111") || ret<0 )
{
end=1;
break;
}
else {
for(int n=0;*(bptr+n) && *(bptr+n)!='\n' && n<=ret;n++)
{
putchar(*(bptr+n));
}
putchar('\n');
buffer=bptr;
break;
}
}
/* end of while loop */
if(end)
{printf("End!");break;};
}
return 0;
}
Программный вывод снимка экрана: