본문 바로가기

System Programming

시스템 프로그래밍 프로젝트 #6

문제 :

 

입력 데이터 :

Command.txt
0.00MB

 

실행 결과 :

 

코드 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
void PrintAssm(char* name_buf, int name_size);
 
struct OPTAB{
    char name[8];
    int len;
} Wordtab[] = { {"LDA"3}, {"STA"4}, {"ADD"5}, {"TIX"2}, {"CMP"6} };
 
int main() {
    char name_buf[8];
    int wordtab_size = sizeof(Wordtab)/12// Wordtab에 정의된 단어 갯수, 12 = size of char[8] + int 
    FILE* fp;
    
    if((fp = fopen("Command.txt""r"))==NULL) {
            printf("file not found...\n"); exit(1);
    }
    while(fgets(name_buf, sizeof(name_buf), fp) != NULL) { // fgets() 함수는 scanf나 gets()와는 달리 뒤에 개행문자가 붙는다  
        if(name_buf[0== '\n'// name_buf 배열 맨 처음이 개행문자이면 메시지 출력 없이 무시 
              continue;
        if(name_buf[strlen(name_buf) - 1== '\n'// name_buf 배열 맨 끝이 개행문자이면 
            name_buf[strlen(name_buf) - 1= '\0'// naem_buf 배열 맨 끝에 붙은 개행문자 제거 
        PrintAssm(name_buf, wordtab_size);
    }
    fclose(fp);
}
 
void PrintAssm(char* name_buf, int wordtab_size){
    static int k=1// 줄 번호를 나타내는 변수 
    static int loc=0// 단어의 시작 위치를 나타내는 변수 
    int i, res=-1;
    for(i=0; i<wordtab_size; i++){
        res = strcmp(name_buf, Wordtab[i].name); // strcmp : 두 문자열이 같으면 0 리턴 
        if(res==0){
            break;
        }
    }
    if(i==wordtab_size){
        printf(" Undefined word\n"); // Wordtab 배열 안에 정의되어 있지 않는 명령어면 출력하고 단어 무시 
    }
    else{
        if(k < 10)
            printf(" ");
        printf("%d, %.2X, %s, %.2d\n", k, loc, Wordtab[i].name, Wordtab[i].len);
        loc += Wordtab[i].len; // 단어의 해당길이를 더해서 다음 시작 위치를 알려줌 
        k++;
    }
}

 

설명 :

21번 줄 if문은 입력 데이터를 Enter를 여러개 입력한다면 무시하고 다음 데이터를 읽어오는 부분입니다.

Dev-C++ 5.11 에서 작성된 코드입니다. Linux에서 작성한다면 입력 데이터 파일로 .txt 확장자 대신 .s 확장자를 사용합니다.