Я новичок в C. В настоящее время я пытаюсь написать интерпретатор Brainfuck. Я пробовал это до сих пор.
#include <unistd.h>
#include <stdlib.h>
char *line;
int curr_pos;
void interprete(char *coms)
{
int a;
int curr_loop;
a = -1;
curr_loop = 0;
while (line[++a])
line[a] = 0;
a = -1;
while (coms[++a])
{
if (coms[a] == '+')
line[curr_pos]++;
else if (coms[a] == '-')
line[curr_pos]--;
else if (coms[a] == '>')
curr_pos++;
else if (coms[a] == '<')
curr_pos--;
else if (coms[a] == '.')
write(1, &line[curr_pos], 1);
else if (coms[a] == '[')
{
if (line[curr_pos])
curr_pos++;
else
{
curr_loop = 1;
while (curr_loop)
{
++a;
if (coms[a] == '[')
curr_loop++;
else if (coms[a] == ']')
curr_loop--;
}
}
}
else if (coms[a] == ']')
{
if (line[curr_pos])
{
curr_loop = 1;
while (curr_loop)
{
--a;
if (coms[a] == '[')
curr_loop--;
else if (coms[a] == ']')
curr_loop++;
}
}
else
curr_pos++;
}
}
}
int main(int ac, char **av)
{
if (ac == 2)
{
curr_pos = 0;
line = malloc(sizeof(char) * 4096);
interprete(av[1]);
}
write(1, "\n", 1);
}
Работает только без циклов ("[" и "]"). Когда я пытаюсь:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
Это дает мне результат
^B^A^H^H^K^B^Q^K^N^H^@^C^@
Ожидаемый результат:
Hello World!
line
кажется мне странной, особенно конец цикла: вы пишете 0 внутри строки, пока не найдете первый нулевой элемент. Но строка выделяется с помощью malloc, поэтому нет гарантии, что хотя бы один элемент равен нулю, или такой набор (1, 2, 0, 4) - person Garf365   schedule 22.09.2016line = calloc(4096, 1);
- person LPs   schedule 22.09.2016malloc & friends
возвращаемое значение!= NULL
. - person LPs   schedule 22.09.2016