Программа игнорирует ввод

Я пытаюсь написать простую Brainfuck интерпретатор в C ++. Пока он отлично работает, но игнорирует команду ввода символов (‘,’).

Переводчик:

#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;

#define SIZE 30000

void parse(const char* code);

int main(int argc, char* argv[])
{
ifstream file;
string line;
string buffer;
string filename;

cout << "Simple BrainFuck interpreter" << '\n';
cout << "Enter the name of the file to open: ";
cin >> filename;
cin.ignore();

file.open(filename.c_str());
if(!file.is_open())
{
cout << "ERROR opening file " << filename << '\n';
system("pause");
return -1;
}
while (getline(file, line)) buffer += line;

parse(buffer.c_str());

system("pause");
return 0;
}
void parse(const char* code)
{
char array[SIZE];
char* ptr = array;

char c;
int loop = 0;
unsigned int i = 0;
while(i++ < strlen(code))
{
switch(code[i])
{
case '>':       ++ptr;  break;
case '<':       --ptr;  break;
case '+':       ++*ptr; break;
case '-':       --*ptr; break;
case '.':
cout << *ptr;
break;
case ',':
cin >> *ptr;
break;
case '[':
if (*ptr == 0)
{
loop = 1;
while (loop > 0)
{
c = code[++i];
if (c == '[') loop ++;
else if (c == ']') loop --;
}
}
break;
case ']':
loop = 1;
while (loop > 0)
{
c = code[--i];
if (c == '[') loop --;
else if (c == ']') loop ++;
}
i --;
break;
}
}
cout << '\n';
}

Код UtraSimple, который ломает все:

,.

Кто-нибудь знает, что заставляет его пропускать ввод символов?

2

Решение

Я бы посмотрел на это для начала:

unsigned int i = 0;
while(i++ < strlen(code))  // increments i NOW !
{
switch(code[i])        // uses the incremented i.

Первый персонаж, который будет обработан, будет code[1], не code[0],

Итак, программа ",." будет первый процесс . затем \0 (конец строки), следовательно, не будет входной команды , обработанный.

Вы можете увидеть это, если измените код следующим образом:

unsigned int i = 0;
while(i++ < strlen(code))
{
cout << "DEBUG [" << i << ":" << (int)code[i] << ":" << code[i] << "]\n";
switch(code[i])

и вы увидите:

DEBUG [1:46:.]
DEBUG [2:0: ]

Вы должны задержать увеличение i до тех пор после вы закончили с этим.

7

Другие решения

Других решений пока нет …