не удается получить два входа в brainf ** k

#c #brainfuck

#c #brainfuck

Вопрос:

Поэтому по какой-то причине, при попытке получить два разных входа в brainf ** k, он запрашивает у меня только один, а затем завершает работу. Я пытаюсь создать что-то, что принимает два числа и добавляет их, вот код:

 ,      
>      
,   
[ 
    <     
           
    >    
    -    
]     
<
------------------------------------------------
.
  

И вот мой интерпретатор:

 #include <stdio.h>
#include <stdlib.h>
#define ARRAYSIZE 16777216
#define MAXCODESIZE 65536

int stack[MAXCODESIZE], stackp;
char code[MAXCODESIZE]; int codep, codelength;
short int array[ARRAYSIZE]; int memp;
int targets[MAXCODESIZE];
int c;
FILE *prog;

int main(int argc, char **argv){
    if (argc > 2) fprintf(stderr, "Too many arguments.n"), exit(1);
    if (argc < 2) fprintf(stderr, "Usage: brain <file>n"), exit(1);
    if(!(prog = fopen(argv[1], "r"))) fprintf(stderr,"Can't open the file %s.n", argv[1]),exit(1);
    codelength = fread(code, 1, MAXCODESIZE, prog);
    fclose(prog);
    for(codep=0; codep<codelength; codep  ){
        if (code[codep]=='[') stack[stackp  ]=codep;
        if (code[codep]==']'){ 
            if(stackp==0){ 
                fprintf(stderr,"Unmatched ']' at byte %d.", codep), exit(1);
            } else {
                --stackp; 
                targets[codep]=stack[stackp]; 
                targets[stack[stackp]]=codep; 
            }
        }
    }
    if(stackp>0){ 
        fprintf(stderr,"Unmatched '[' at byte %d.", stack[--stackp]), exit(1);
    }
    for(codep=0;codep<codelength;codep  ){
         switch(code[codep]){
            case ' ': array[memp]  ; break;
            case '-': array[memp]--; break;
            case '<': memp--; break;
            case '>': memp  ; break;
            case ',': if((c=getchar())!=EOF) array[memp]=c=='n'?10:c; break;
            case '.': putchar(array[memp]==10?'n':array[memp]); fflush(stdout); break;
            case '[': if(!array[memp]) codep=targets[codep]; break;
            case ']': if(array[memp]) codep=targets[codep]; break;
        }
    }
    exit(0);
}
  

Я скопировал его с github, поэтому он может быть не идеальным, так что есть идеи, как это исправить??

Действительно ценю помощь 🙂

Ответ №1:

Ваш второй getchar() получит n выход из буфера и, следовательно, не будет ждать ввода пользователя. Вы должны использовать оба.

Ответ №2:

Я не могу проверить интерпретатор, но если вы используете мой интерпретатор brainfuck и следующий код:

 -----------[           >,----------] [-<]
  

Это должно сработать, если вам интересно, почему он автоматически «нажимает ENTER», это потому, что я использовал getkey модуль, и если вам нужно объяснение:

 set block 0 to -11
it enters a loop
  adds 11 (first time = block == 0, after, char value is one above, fixed in the next loop)
  moves over and fetches input
  subtracts 10
it exits the loop IF the value is 0
adds 1
enters loop
  subtracts one, than moves over
exits loop