문제 :
입력 데이터 :
실행 결과 :
코드 :
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 확장자를 사용합니다.
'System Programming' 카테고리의 다른 글
시스템 프로그래밍 프로젝트 #1 (1) | 2020.01.12 |
---|---|
시스템 프로그래밍 프로젝트 #2 (1) | 2020.01.12 |
시스템 프로그래밍 프로젝트 #3 (1) | 2020.01.12 |
시스템 프로그래밍 프로젝트 #4 (1) | 2019.12.19 |
시스템 프로그래밍 프로젝트 #5 (1) | 2019.11.23 |