为何除网页版外的Brainfuck解释器均输出♀♂等异常字符?自制C++ Brainfuck解释器输出异常如何修复?
嘿,我来帮你拆解这个问题——其实你遇到的情况分两种核心原因,咱们一步步来理清楚:
问题根源分析
1. 你写的BF代码加号数量可能和预期不符
你说代码应该从字符C(ASCII码67)开始打印,但实际输出了一堆奇怪符号,大概率是加号数写错了。咱们算笔账:
- BF里每个
+会把当前单元格的值加1,初始值是0。 - 要得到
C(67),得写67个+;如果你的代码里是128个+,初始值就是128——而ASCII码128对应的是扩展ASCII字符♀,正好是你输出的第一个字符,后续递减时会依次输出127(♂)、126(~)……直到0,其中0-31都是不可打印的控制字符,终端就会把它们渲染成那些奇奇怪怪的符号。
2. BF解释器的默认行为就是输出所有ASCII值
哪怕加号数量正确,当单元格值降到32(空格)以下时,终端会把这些不可打印的控制字符(0-31)显示成奇怪符号——这是所有标准BF解释器的默认行为,因为Brainfuck本身并没有规定只输出可打印字符,它只是老老实实地输出单元格对应的ASCII值。
针对性修复方案
根据你的需求,这里有两种解决办法:
方案一:修正BF代码(如果是加号数量错了)
如果你确实想从C开始打印到1(循环逻辑决定0不会被打印),把代码里的加号改成67个:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[.-]
要是想连0也打印出来,可以调整循环内的指令顺序,或者在循环结束后补个.:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[-.-]
(这个版本会打印B到0,如果要从C到0,在循环后面再加个.就行)
方案二:修改你的C++解释器,过滤不可打印字符
如果你希望解释器自动跳过那些奇怪符号,只输出可见字符,修改处理.指令的代码就行——判断当前单元格的值是否在**可打印ASCII范围(32-126)**里,符合条件才打印,否则可以跳过或者用占位符(比如?)代替。
给你个代码片段参考:
// 假设cell是你存储当前单元格值的变量,类型可以是unsigned char或int if (cell >= 32 && cell <= 126) { std::cout << static_cast<char>(cell); } else { // 可选:要么啥也不做跳过,要么打印占位符 // std::cout << '?'; }
改完之后,你的解释器就只会输出能看懂的字符啦。
另外补个小知识点:BF的循环逻辑是先判断单元格值是否为0,再执行循环体,所以[.-]的顺序是「打印当前值 → 减1 → 重新判断」,因此0不会被打印;如果要打印0,就得把循环里的指令换成-在前.在后,比如[-.-]。
内容的提问来源于stack exchange,提问作者user14676520
相关产品推荐
相关产品推荐

