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