GNU Prolog中如何在pl文件内使用get_code获取字符ASCII值
问题原因
- 代码中先调用了
read(X),read/1谓词的作用是读取完整的Prolog项,会等待用户输入后按下回车才完成解析,此时输入流中残留的换行符ASCII值为10,后续my_get_code(X)读取的就是这个换行符,因此无论输入什么内容都会固定输出10。 - 自定义
my_get_code/1中的get_linedit_prompt('')是错误用法,该谓词用于获取当前行编辑提示符,设置空提示符应该使用set_linedit_prompt('')。
正确实现方案
首先去掉冗余的read/1调用,直接读取输入流的字符ASCII值,添加大写字母的范围判断逻辑,符合条件则加32得到小写ASCII值,其余字符保持原值即可,完整代码如下:
% 无提示读取单个字符的ASCII值 my_get_code(C) :- set_linedit_prompt(''), % 可选:关闭输入缓冲,输入字符后无需按回车即可立刻读取 % set_stream_input(user_input, buffer(false)), get_code(C). % 大写ASCII转小写逻辑 lower_case(UpperCode, LowerCode) :- UpperCode >= 65, UpperCode =< 90, % 匹配A-Z的ASCII范围 LowerCode is UpperCode + 32, !. % 截断避免匹配下方兜底规则 % 非大写字符直接返回原值 lower_case(Code, Code). % 调用入口:读取字符、转换、输出结果 lower :- my_get_code(InputCode), lower_case(InputCode, OutputCode), write('输入字符ASCII:'), write(InputCode), nl, write('转换后ASCII:'), write(OutputCode), nl, write('转换后字符:'), put_char(OutputCode), nl.
使用说明:加载代码后在GNU Prolog交互端输入lower.触发执行,输入需要转换的字符即可得到对应结果。如果开启了无缓冲模式,输入字符后会立刻返回结果,否则需要按下回车确认输入。
内容的提问来源于stack exchange,提问作者Student_in_computer_science
相关产品推荐
相关产品推荐

