gpt4 book ai didi

c - Brainfuck 解释器在 c 打印中遇到麻烦

转载 作者:行者123 更新时间:2023-11-30 17:14:57 24 4
gpt4 key购买 nike

我正在尝试用 C 语言编写一个非常简单的、脑残的解释器,在尝试根据我的理解打印某些字符时遇到了问题。

这是我的全部代码:

#include <stdio.h>

int bla(char tabukaz[30000], int ukaz, int num) {
int sum = 0;
int index = ukaz;
while (sum > -1) {
index -= num;
if (tabukaz[index] == ']')
sum += num;
else if (tabukaz[index] == '[')
sum -= num;
}
return index;
}

int main () {
int tab[30000];
int tabukaz[30000];
int c;
int i = 0; int ukaz = 0;
unsigned char ch;
for (int i = 0; i < 30000; i++) {
tab[i] = 0;
tabukaz[i] = 0;
}
while ((c=getchar()) != EOF) {
ch = (unsigned char)c;
if (ch == '>' || ch == '<' || ch == '+' || ch == '-' || ch == '.' || ch == '[' || ch == ']')
{
tabukaz[ukaz] = ch;
}

switch (ch) {
case '>': i++; break;
case '<': i--; break;
case '+': tab[i]++;break;
case '-': tab[i]--; break;
case '.': putchar(tab[i]); break;
case '[':
if (tab[i]==0) {
ukaz = bla(tabukaz, ukaz, -1);
}
break;
case ']':
if (tab[i]!=0) {
ukaz = bla(tabukaz, ukaz, 1);
}
break;
default:
break;
}
ukaz++;
}
return 0;
}

这是有问题的输入(我试图避免实际输入中的其他文本(记住这里的所有内容都是输入的一部分,甚至是不必要的文本)我们提供了一个 make 文件,它将写入输出到文本文件中,并将其与预定义的文本进行比较,问题是我的文本文件作为二进制文件出现,我不明白为什么。问题可能隐藏在我处理 [ 的方式中和 ] 因为在没有它们的早期测试中我没有遇到这个问题

+++++ +++++             initialize counter (cell #0) to 10
[ use loop to set 70/100/30/10
> +++++ ++ add 7 to cell #1
> +++++ +++++ add 10 to cell #2
> +++ add 3 to cell #3
> + add 1 to cell #4
<<<< - decrement counter (cell #0)
]
> ++ . print 'H'
> + . print 'e'
+++++ ++ . print 'l'
. print 'l'
+++ . print 'o'
> ++ . print ' '
<< +++++ +++++ +++++ . print 'W'
> . print 'o'
+++ . print 'r'
----- - . print 'l'
----- --- . print 'd'
> + . print '!'
> . print '\n'

根据某人的建议,我这样做了:

while ((c=getchar())!=EOF) {
ch = (unsigned char)c;
if (ch == '>' || ch == '<' || ch == '+' || ch == '-' || ch == '.' || ch == '[' || ch == ']')
{
tabukaz[ukaz]=ch;
stukaz++;
}
}

while (stukaz>0) {
switch (tabukaz[ukaz]) {
case '>': i++; break;
case '<': i--; break;
case '+': if(tab[i]==255) tab[i] = 0;
else tab[i]++;
break;
case '-': if (tab[i]==0) tab[i] = 255;
else tab[i]--;
break;
case '.': printf ("%c", tab[i]); break;
case '[':
if (tab[i]==0) {
ukaz = bla(tabukaz, ukaz, -1);
}
break;
case ']':
if (tab[i]!=0) {
ukaz = bla(tabukaz, ukaz, 1);
}
break;
default: break;
}
stukaz--;
ukaz++;
}

但是问题现在扩展到之前的测试,因为它甚至将它们输出为二进制文件,我认为 [] 代码有问题因此,它不会正确地增加字段来打印不需要的字符,仅当在它周围放置另一个循环时,它如何扩展到没有它们的测试,我不知道。

编辑:上述循环的问题不是 while 循环没有进入低谷,问题是它永远不会进入 switch,有什么解决方案吗?

最佳答案

扫描匹配括号时测试错误。

 while (sum > -1) {
index -= num;
if (tabukaz[index] == ']')
sum += num;
else if (tabukaz[index] == '[')
sum -= num;
}

您将 num 设置为 1 以进行向后扫描,将 num 设置为 -1 以进行向前扫描。

    case '[':
if (tab[i]==0) {
ukaz = bla(tabukaz, ukaz, -1);
}
break;
case ']':
if (tab[i]!=0) {
ukaz = bla(tabukaz, ukaz, 1);
}
break;

所以测试应该是(sum != 0),这样当括号从任一方向平衡时它就会停止。当然,sum 初始化为 0,因此我建议使用 do { ... } while(); 循环,以便测试结束。

另外,请记住,您是在循环末尾递增指令指针。

        ukaz++;

因此,您可能希望将指针设置为 bla(...) - 1,以便增量将指针置于正确的位置。

<小时/>

您可能还想查看my own brainfuck interpreter ,这与你的非常相似。我的一位审阅者对使用跳转表优化循环执行给出了很好的解释。

关于c - Brainfuck 解释器在 c 打印中遇到麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30125951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com