Python中使用sys.stdin能否实现读取输入字符但不消耗它?
能否读取输入字符但不消耗它?
我希望读取下一个字符但不消耗它,这样后续循环能完整读取输入。比如输入a/b时,当前代码只输出a/,因为b被意外消耗了。
示例代码
import sys while state < 100: if read: c = sys.stdin.read(1) else: read = True if c=='/': next_c=sys.stdin.peek(1) if next_c=='/': state = MT[state][filter('//')] else: state = MT[state][filter(c)] else: state = MT[state][filter(c)] if state < 100 and state !=0: lexeme += c
解决方案
Python的sys.stdin.peek(size)方法正好能满足读取但不消耗输入字符的需求——它会返回指定长度的输入内容,但不会移动输入流的指针,后续的read()操作仍然会从当前位置开始读取。
针对你的代码问题,调整逻辑后可以实现预期效果:
import sys # 假设MT状态转移表、filter处理函数已提前定义 state = 0 lexeme = "" read = True while state < 100: if read: c = sys.stdin.read(1) if not c: # 处理输入结束的边界情况 break else: read = True if c == '/': # 读取下一个字符但不消耗 next_c = sys.stdin.peek(1) # 兼容输入结束时next_c为空的情况 if next_c == '/': # 匹配到//,主动读取第二个/完成处理 c += sys.stdin.read(1) state = MT[state][filter(c)] lexeme += c else: state = MT[state][filter(c)] if state < 100 and state != 0: lexeme += c else: state = MT[state][filter(c)] if state < 100 and state != 0: lexeme += c print(lexeme)
关键说明
sys.stdin.peek(1)获取的字符不会被消耗,下一次read()仍能读到该字符- 当检测到连续的
//时,需要主动读取第二个/,避免下一次循环重复处理第一个/ - 增加输入结束的判断,防止空字符引发的无限循环
内容的提问来源于stack exchange,提问作者rax-hacks
相关产品推荐
相关产品推荐

