程序忽略了输入

Del*_*ake 2 c++ interpreter input brainfuck

我正在尝试用C++ 编写一个简单的brainfuck解释器.它到目前为止工作得很好,但它忽略了字符输入命令(',').

口译员:

#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';
}
Run Code Online (Sandbox Code Playgroud)

UtraSimple脑跳代码打破了一切:

,.
Run Code Online (Sandbox Code Playgroud)

有谁知道是什么原因导致它跳过输入字符?

pax*_*blo 7

我一直在看这个:

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

将要处理的第一个字符将是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])
Run Code Online (Sandbox Code Playgroud)

你会看到:

DEBUG [1:46:.]
DEBUG [2:0: ]
Run Code Online (Sandbox Code Playgroud)

你需要暂缓递增i,直到你完成它.

  • 一旦你看到它们,bug总是比你想象的更明显. (3认同)