c打印故障中的Brainfuck解释器
我正试图用C编写一个非常简单的brainfuck解释器,但我在试图根据我的理解输出某些字符时遇到了问题 这是我的全部代码:c打印故障中的Brainfuck解释器,c,printing,interpreter,brainfuck,C,Printing,Interpreter,Brainfuck,我正试图用C编写一个非常简单的brainfuck解释器,但我在试图根据我的理解输出某些字符时遇到了问题 这是我的全部代码: #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
#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;
}
根据某人的建议,我这样做了:
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((c=getchar())!=EOF){
ch=(无符号字符)c;
如果(ch='>'| ch='':i++;中断;
案例'扫描匹配括号时测试错误
while (sum > -1) {
index -= num;
if (tabukaz[index] == ']')
sum += num;
else if (tabukaz[index] == '[')
sum -= num;
}
向后扫描时将num
设置为1,向前扫描时设置为-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
,以便增量将指针放置在正确的位置
您可能还想看看,它与您的非常相似。我的一位审阅者对使用跳转表优化循环执行给出了极好的解释。您的问题是为什么您的输出是二进制的吗?我有点困惑:)您是在什么环境下编译和执行的?我猜您的意思是不可打印的(或有趣的)字符被写入屏幕。在这种情况下,为什么不将putchar(x)
替换为printf(“%d\n”,x)
以查看这些字符的实际值。这可能有助于您找到错误。在执行初始化循环后,您的寄存器指针i
的值将为30000。这是数组之外的一个索引。@MaartenBodewes绝对不是。请阅读主题指导原则上的代码审阅。@MaartenBodewes否,确实如此不属于代码审查。请阅读。重要的是要记住:包含“问题”一词的问题不属于代码审查。
ukaz++;