如何停止或中断获取键盘输入缓冲区其余部分的低级读取功能
How to stop or interrupt low-level read function fetching the rest of keyboard input buffer
我应该怎么做才能避免程序自循环遍历所有键盘缓冲区?
我不太清楚低级 read() 函数是如何运行的,但显然它就像在一个单独的非阻塞线程上,我不能强迫它停止接收比我想要的更多的东西。
例如,在下面的代码中,我只是想强制用户在终端中通过键盘输入 4 个字符。但是由于 '\n' 换行,即使输入 "123"+[enter] , ret=read(0,buffer,4) returns 4 而不是 3...因此 while 循环条件有效并且程序进入循环,虽然它不应该..此外,即使输入“1234”+[enter],ret仍然得到4的值......但是这次遇到了第二个问题,while循环执行了两次,因此提示连续两行"Enter text:"...
能否请您帮助解决如何正确组织代码以避免进一步处理键盘缓冲区读取?以及如何克服“123”+[enter]=4个字符的错误评价?
谢谢
注意:如果您观察输出图像,请注意当输入 3 个字符时,如“123”和“456”,它们会被重印,表明在 while 循环中输入(虽然,不应该有)..and当输入“1234”和“7898”时可以观察到第二个问题......它们仍然被重印显示我们在循环内 - 这没关系......但不应该打印 "Enter text:" 的双重提示...它们应该是单行..显示读取函数以某种方式在循环中再次迭代,以获得额外的换行符-[enter key] ...当输入多个字符时,循环不应该 运行 对于每个 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;
}
屏幕截图程序输出:
有很多方法可以做到这一点,但如果你真的想使用读取,你可以将读取填充的缓冲区的内容复制到第二个缓冲区,如下所示:
char tempbuf[4];
int index = 0;
while((ret=read(0,buffer,4))==4)
{
index = index % 4;
for( int i = 0; i < 4; i++ )
{
if(!isspace( buffer[i]) // or if(buffer[i] != '\n')
tempbuf[++index] =buffer[i];
}
if( !strcmp(tempbuf,"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;};
}
int main(int argc, char const *argv[])
{
char buf[BUFSIZE];
int ret;
for(;;)
{
printf("Enter text : \n");
while((ret=read(0,buf,4))==4)
{
buf[ret]='[=10=]';
if(!strcmp(buf,"exit"))
exit(0);
if(buf[ret-1]=='\n') break;
else {
printf("-- entered : %s \n",buf);
}
}/* end of while loop */
}/* end of infinite loop */
return 0;
}
我应该怎么做才能避免程序自循环遍历所有键盘缓冲区? 我不太清楚低级 read() 函数是如何运行的,但显然它就像在一个单独的非阻塞线程上,我不能强迫它停止接收比我想要的更多的东西。
例如,在下面的代码中,我只是想强制用户在终端中通过键盘输入 4 个字符。但是由于 '\n' 换行,即使输入 "123"+[enter] , ret=read(0,buffer,4) returns 4 而不是 3...因此 while 循环条件有效并且程序进入循环,虽然它不应该..此外,即使输入“1234”+[enter],ret仍然得到4的值......但是这次遇到了第二个问题,while循环执行了两次,因此提示连续两行"Enter text:"...
能否请您帮助解决如何正确组织代码以避免进一步处理键盘缓冲区读取?以及如何克服“123”+[enter]=4个字符的错误评价? 谢谢
注意:如果您观察输出图像,请注意当输入 3 个字符时,如“123”和“456”,它们会被重印,表明在 while 循环中输入(虽然,不应该有)..and当输入“1234”和“7898”时可以观察到第二个问题......它们仍然被重印显示我们在循环内 - 这没关系......但不应该打印 "Enter text:" 的双重提示...它们应该是单行..显示读取函数以某种方式在循环中再次迭代,以获得额外的换行符-[enter key] ...当输入多个字符时,循环不应该 运行 对于每个 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;
}
屏幕截图程序输出:
有很多方法可以做到这一点,但如果你真的想使用读取,你可以将读取填充的缓冲区的内容复制到第二个缓冲区,如下所示:
char tempbuf[4];
int index = 0;
while((ret=read(0,buffer,4))==4)
{
index = index % 4;
for( int i = 0; i < 4; i++ )
{
if(!isspace( buffer[i]) // or if(buffer[i] != '\n')
tempbuf[++index] =buffer[i];
}
if( !strcmp(tempbuf,"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;};
}
int main(int argc, char const *argv[])
{
char buf[BUFSIZE];
int ret;
for(;;)
{
printf("Enter text : \n");
while((ret=read(0,buf,4))==4)
{
buf[ret]='[=10=]';
if(!strcmp(buf,"exit"))
exit(0);
if(buf[ret-1]=='\n') break;
else {
printf("-- entered : %s \n",buf);
}
}/* end of while loop */
}/* end of infinite loop */
return 0;
}