Добрый день. У меня задание: есть файл с мнемониками ассемблера, надо читать этот файл и говорить мнемоника ли, или просто набор символов. Мнемоники могут начинаться не с начала файла. Я пишу вот так:
| Код | #include <stdlib> #include <stdio.h> #include <string.h> #include <ctype.h> #include <conio.h> const struct { char name [8]; int code; } asm_mnems[]= { {"add",37}, {"mul",28}, {"sub",43}, {"jne",23} }; int main (void) { FILE *fp; char buf [1000]; int i, j, n, k; fp = fopen("asm.txt","rt"); if (fp == NULL) { printf("ERROR!/n"); getch(); exit(66); } while (fgets(buf, 1000, fp)) { i=0; while (isspace(buf[i])) i++; if (buf[i]=='\0') continue; if (buf[i]==';') continue; if (!isalpha(buf[i])&& buf[i]!='_'&& buf[i]!='@') { printf("Invalid character\n"); printf("%s\n", buf); getchar(); exit(66); } j=i; while ((isalpha (buf[i]) || buf[i]==' ' || buf[i]=='@')&& !isspace(buf[i])) { i++; } buf[i]='\0'; // вместо бинароного поиска - простой перебор for (int z = 0; z<sizeof(asm_mnems)/12; z++) { if (stricmp(buf+j, asm_mnems[z].name)==0) printf("ASM instruction: %s, code = %d \n",asm_mnems[z].name, asm_mnems[z].code);
//================================================================== else // Вот без этих строк работает все хорошо, но не удовлетворяет условиям здания printf("User's label or mistake %s \n",buf); //=================================================================== }
}
fclose(fp); getchar(); return 0; }
|
Пробую запускать с вот таким файлом
| Код |
mul add
sub
olololo:
mul
sub
mul
|
Если строку, которую я выделил в коде (62-65), убрать, то все работает как надо, т.е. распознает мнемоники. Но мне надо, что бы кроме мнемоник показывало что такая-то строка является просто набором символов, либо меткой. Поэтому я добавил ту строку. После чего получаю вот такой результат
| Код | User's label or mistake mul ASM instruction: mul, code = 28 User's label or mistake mul User's label or mistake mul ASM instruction: add, code = 37 User's label or mistake add User's label or mistake add User's label or mistake add User's label or mistake sub User's label or mistake sub ASM instruction: sub, code = 43 User's label or mistake sub User's label or mistake olololo User's label or mistake olololo User's label or mistake olololo User's label or mistake olololo User's label or mistake mul ASM instruction: mul, code = 28 User's label or mistake mul User's label or mistake mul User's label or mistake sub User's label or mistake sub ASM instruction: sub, code = 43 User's label or mistake sub User's label or mistake mul ASM instruction: mul, code = 28 User's label or mistake mul User's label or mistake mul
|
Вобщем мне надо, что бы фразу User's label or mistake вывело только раз, когда встретит строку olololo. Что можно с этим поделать? |