Brainfuck解释器未运行某些代码

时间:2019-12-07 17:58:50

标签: c interpreter brainfuck

我对C编程还是有点陌生​​,因此决定用C编写一个头脑清爽的解释器是学习该语言的好方法。我可以用以下bf代码编写和测试:

这应该打印一个问候世界

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

这按预期工作,所以我认为我的解释器工作正常,但是当我用Hello World代码的一些变体进行测试时,发生了奇怪的事情。

此bf代码还应该显示一个hello world,但它会打印出²♣■■ÖFu ÖÖ■♦u

--<-<<+[+[<+>--->->->-<<<]>]<<--.<++++++.<<-..<<.<+.>>.>>.<<<.+++.>>.>>-.<<<+.

此bf代码还应该显示一个hello world,但程序会卡住

+[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.

这是我编写的用于解释Brainfuck的代码:

#include <stdio.h>

int main(int argc, char const *argv[])
{

    if (argc == 1)
    {
        printf("You must specify a file path\n");
        return -1;
    }

    //amount of memory locations available
    int mem = 30000;
    //creating an integer array with mem positions
    char arr[mem];
    //current memory position
    int index = 0;

    //setting everything to 0
    for (int i = 0; i < mem; i++)
    {
        arr[i] = 0;
    }

    FILE *file = fopen(argv[1], "r");

    if (file == NULL)
    {
        printf("ERROR, file couldn't be read\n");
        return -1;
    }

    //reading util the END OF THE FILE
    char c;
    while ((c = fgetc(file)) != EOF)
    {
        if (c == '+')
        {
            arr[index]++;
        }
        else if (c == '-')
        {
            arr[index]--;
        }
        else if (c == '>')
        {
            index++;
            index %= mem;
        }
        else if (c == '<')
        {
            index--;
            index %= mem;
        }
        else if (c == '.')
        {
            printf("%c", arr[index]);
        }
        else if (c == ',')
        {
            scanf("%c", &arr[index]);
        }
        else if (c == '[')
        {
            char temp = fgetc(file);
            int skip = 0;

            while (temp != ']' || skip != 0)
            {
                if (temp == '[')
                    skip++;
                if (temp == ']' && skip > 0)
                    skip--;

                temp = fgetc(file);
            }

            fseek(file, -1, SEEK_CUR);
        }
        else if (c == ']')
        {
            if (arr[index] != 0)
            {
                fseek(file, -2, SEEK_CUR);
                char temp = fgetc(file);

                int skip = 0;

                while (temp != '[' || skip != 0)
                {
                    if (temp == ']')
                        skip++;
                    if (temp == '[' && skip > 0)
                        skip--;

                    fseek(file, -2, SEEK_CUR);
                    temp = fgetc(file);
                }
            }
            else
            {
                continue;
            }
        }
    }

    fclose(file);
    return 0;
}

非常感谢您能帮我解决这个问题。

1 个答案:

答案 0 :(得分:3)

index为负数时,这段代码可能有问题。

        index--;
        index %= mem;

%运算符保留左参数的符号,因此-1 % mem是–1,而不是预期的mem–1。