我对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;
}
如果你能在这件事上帮我的话,非常感谢。
当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个迭代器吗?
你能给我解释一下这段代码吗,为什么我们没有任何返回类型,代码仍然工作正常?
问题内容: 我正在尝试将换行符()转换为html 。 根据Google网上论坛的讨论,这是我得到的: 那里的讨论还建议在视图中使用以下内容: 这似乎正在使用旧的过滤器,而现在我们应该使用属性。 无论如何,这都会带来一个问题:我不希望原始字符串()中的任何HTML 都呈现为HTML;只有的。 例如,给定以下字符串: 虽然7> 5,但 我仍然不希望html和其他东西出现在这里… 我希望它输出: 有什么
据我所知,直线的意思是,那个变量运动得到乘以向量inputVec的x部分的绝对值,但我不明白接下来会发生什么。