输入缓冲区对程序的影响及解决方法(多种语言都会出现)

键盘输入字符并输出,在多次循环时,如果有时间等待或者阻塞,此时还没提示让输入字符时,依然可以敲击键盘输入字符,输入回车后会把字符存入输入缓冲区,下次循环会直接从输入缓冲区读取数据,跳过键盘的输入。

现象:java,Python,shell都会出现,应该是系统对输入的原理就是这样。

1.java举例

//代码举例
        Scanner sc  =  new Scanner(System.in);
        while (true){
            System.out.print("请输入:");
            String str  =  sc.next();
            System.out.println(str);
            Thread.sleep(5000);
        }

//在第一次输入后,sleep过程中输入一些字符串并敲回车
//下次循环,会直接读取输入缓存区的数据,而不会再等键盘的输入。
//输出
请输入:a
a
b  //sleep过程中输入的值
请输入:b    //这个是输出的结果,其实并不想要
请输入:

2.python举例

#代码举例
import time
while True:
    a = input("请输入:")
    print(a)
    time.sleep(5)

3.shell举例

#!/bin/bash
while :
do
        read  -p  "请输入:"  a
        echo $a
        sleep 5
done

解决方案

1、下次输入前清楚输入缓存区(小遍不会,C语言得补一补了)

2、在键盘输入命令前记录下时间戳,在键盘输入命令后再记录一个时间,计算这两个时间的差值,如果时间很段直接continue来重新获取键盘的输入。在此时小编发现输入缓冲区是以回车来记录次数的,所以continue比较合适,多次回车可能会有多次continue。

java程序举例:

        Scanner sc = new Scanner(System.in);
        long l1 = System.currentTimeMillis();
        while (true){
            System.out.println("请输入:");
            l1=System.currentTimeMillis();
            String str = sc.next();
            l1=System.currentTimeMillis() - l1;
            if (l1 <50){
                continue;
            }
            System.out.println(l1);
            System.out.println(str);
            Thread.sleep(5000);
        }

python程序举例:

import time
while True:
    t1=time.time()
    a=input("请输入:")
    t1=time.time() - t1
    if (t1<0.05):
        continue
    print(a)
    time.sleep(5)

shell程序举例:(该程序有个bug,在输入前后之间刚好要切换秒的时候)
解决这个bug请自行百度:shell毫秒时间戳。

#!/bin/bash
while :
do
        t1=$(date +%s)
        read -p "请输入:" a
        t2=$(date +%s)
        let t3=t2-t1
        if [ $t3 -lt 1 ]
        then
                continue
        fi
        echo $t3
        echo $a
        sleep 5
done

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值