当前位置: 首页 > 知识库问答 >
问题:

他妈的解释器没有运行一些代码

翟俊
2023-03-14

我对C语言编程有点陌生,我觉得用C语言做一个brainfuck解释器是学习这门语言的好方法。我可以用这些bf代码编写和测试:

这应该会打印一个hello world

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

这和预期的一样,所以我认为我的解释器工作得很好,但是当我用你好世界代码的几个变体进行测试时,奇怪的事情发生了。

这个bf代码也应该打印一个hello world,但它会打印出²♣■■ÖFu

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

这个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个答案

岳卓君
2023-03-14

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

        index--;
        index %= mem;

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

 类似资料:
  • 这里已经有很多问题了,但我还是会继续。这是一个简单的脑力操翻译。我想出了所有其他符号,但我不知道如何实现循环。有人能帮忙吗? 我有一种感觉,我需要使用Stack,但我似乎不知道如何使用。我以前构建过表达式计算器。。。这需要同样的逻辑吗?

  • 问题内容: 为简单起见,请设想这种情况,我们有一台2位计算机,它具有一对称为r1和r2的2位寄存器,并且仅适用于立即寻址。 假设位序列 00 表示 添加 到我们的CPU中。也 01 的装置将数据移动到R 1和 10组 的装置将数据移动到R2。 因此,这台计算机和一个汇编器都有一种汇编语言,其中的示例代码将像 简而言之,当我将此代码汇编成本地语言时,文件将类似于: 上面的12位是以下代码的本机代码:

  • 我正试着从动觉碎片中获取记录。我循环获取碎片迭代器,然后获取迭代器中的记录。我似乎得到了无数个迭代器,其中没有一个包含任何记录。 我的问题涉及迭代器的寿命。考虑到Kinesis只能保存24小时的数据,迭代器的寿命应该是5分钟,我不应该在任何时间点看到最多288个迭代器吗?

  • 你能给我解释一下这段代码吗,为什么我们没有任何返回类型,代码仍然工作正常?

  • 据我所知,直线的意思是,那个变量运动得到乘以向量inputVec的x部分的绝对值,但我不明白接下来会发生什么。

  • 问题内容: 我正在尝试将换行符()转换为html 。 根据Google网上论坛的讨论,这是我得到的: 那里的讨论还建议在视图中使用以下内容: 这似乎正在使用旧的过滤器,而现在我们应该使用属性。 无论如何,这都会带来一个问题:我不希望原始字符串()中的任何HTML 都呈现为HTML;只有的。 例如,给定以下字符串: 虽然7> 5,但 我仍然不希望html和其他东西出现在这里… 我希望它输出: 有什么