#include <stdio.h>
#include <stdlib.h>
 
#define SIZE 5000
 
char data[SIZE], code[SIZE];  
int ptr, flag;
 
void interpreter(char *ip)
{
  char* re;
    
  while (*ip)
  {
  switch(*ip++)
  {
  case '<': --ptr; break;
  case '>': ++ptr; break;
  case '+': ++data[ptr]; break;
  case '-': --data[ptr]; break;
  case '.': putchar(data[ptr]); fflush(stdout); break;
  case ',': data[ptr] = getchar(); fflush(stdout); break;
  case '[': for (flag=1,re=ip; flag && *ip; ++ip)
  flag += *ip=='[', flag -= *ip==']';
  if(!flag)
  {
  ip[-1] = 0;
  while (data[ptr])
  interpreter(re);
  ip[-1] = ']';
  break;
  }
  case ']': puts("Unbalancded brackets!"), exit(-3);
  default : ;//SKIP
  }
  if (ptr < 0 || ptr > 100)
  puts("Out of Range"), exit(-4);
  }
}
   
int main(int argc, char *argv[])
{
  FILE *fin;
  int codelength;
    
  if (argc != 2)
  return puts("BrainFuck Interpreter v 0.1\nStar\nUsage:BFI filename"), 0;
  if ((fin = fopen(argv[1], "r")) == NULL)
  return puts("Cannot open file!"), -1;
  fseek(fin, 0, SEEK_END);
  if ((codelength = ftell(fin)) > SIZE)
  return puts("The program is too large."), -2;
  fseek(fin, 0, SEEK_SET);
  fread(code, codelength, 1, fin);
  code[codelength] = '\0';
  interpreter(code);
  return 0;
}有些地方不太明白,有空的帮个忙吧,谢谢!

解决方案 »

  1.   

    这是一段判断文件内部的代码,估计文件充满一大堆符号 < > ....
    不过写的不怎么好,int ptr, flag; 也没初始化,--ptr会输出一个错误的数值,但是无关紧要,因为根本就不会调用到 interpreter这个函数
      

  2.   


    恩 是一种代码的解释器。看看能帮忙翻译成JAVA吗?
      

  3.   

    照着代码翻译的,有些不理解逻辑的地方不知道对不对?(感觉原C++的代码好像不太安全)import java.io.*;
    import java.util.*;class SomeClass {
        static final int SIZE = 5000;
        static char[] data = new char[SIZE];
        static char[] code = new char[SIZE];
        static int ptr, flag;    public static void interpreter(char[] ip, int pos) {
            int i = pos, j = 0;
            while (ip[i] != '\0') {
                switch(ip[i++]) {
                    case '<': 
                        --ptr; 
                        break;
                    case '>': 
                        ++ptr; 
                        break;
                    case '+': 
                        ++data[ptr]; 
                        break;
                    case '-': 
                        --data[ptr]; 
                        break;
                    case '.': 
                        System.out.println(data[ptr]); 
                        System.out.flush();
                        break;
                    case ',': 
                        try {
                           data[ptr] = (char)(System.in.read()); 
                           System.out.flush(); 
                        } catch (Exception e) {
                           e.printStackTrace();
                        }
                        break;
                    case '[': //这里的逻辑有点不太清楚
                        for (flag=1, j=i; flag > 0 && ip[i] != '\0'; ++i) {
                            if (ip[i] == '[') {flag++;}
                            if (ip[i] == ']') {flag--;}
                        }
                        if(flag > 0) {
                            ip[i-1] = (char)0;
                            while (data[ptr] > '\0') {
                                interpreter(ip, j);
                            }
                            ip[i-1] = ']';
                            break; //C++中的这个break能退到什么级别?这里的处理有点不太清楚
                       }
                       break; //java中没这个break会继续执行下面的代码,估计这里和原程序有点出入
                   case ']': 
                       System.out.println("Unbalancded brackets!");
                       System.exit(-3);
                   default : 
                       break;//SKIP
                }
                if (ptr < 0 || ptr > 100) {
                    System.out.println("Out of Range");
                    System.exit(-4);
                }
            }
        }    public static void main(String[] args) {
            File fin;
            int codelength;        if (args.length != 1) {
                System.out.println("BrainFuck Interpreter v 0.1\nStar\nUsage:BFI filename");
                System.exit(0);
            }
            try {
                fin = new File(args[0]);
                codelength = (int)fin.length();
                if (codelength > SIZE) {
                    System.out.println("The program is too large.");
                    System.exit(-2);
                }
                FileReader fr = new FileReader(fin);
                Arrays.fill(code, '\0');
                fr.read(code, 0, codelength);
                fr.close();
                System.exit(0);
            } catch (Exception e) {
                System.out.println("Cannot open file!");
                System.exit(-1);
            }
        }
    }
      

  4.   

    主函数里漏了函数调用了
    fr.close();
    interpreter(code, 0);
    System.exit(0);