# 아래의 텍스트 파일 “numb.s”를 open하여, 숫자 단어들에 대한 unsigned 정수를 구한 후 전체 합을 출력한다(단, X’...’ 형태이면 16진수이고, C’...’ 형태이면 ASCII 코드들로 이루어진 16진수를 의미함).
-smple3.c


[실행결과]

1.단어를 int get_token_sum()함수로부터 받아오면 우선 문자 맨 앞 cp[0]을 확인하여 어떤 방식으로 변환할 것인지 파악한다.
2. ‘X’이면 16진수를 10진수로 바꿔주고 합을 계산해준다.
3.’C’이면 아스키코드 16진수를 10진수로 바꾸어 해당 숫자를 더해준다.
4. 이 둘다 아니면 그냥 정수이다. cp는 문자열 임으로 숫자로 바꾸어 합을 더해준다.
<소스코드>
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#include<math.h>
int get_token_sum(char *bp);
int main() {
FILE *fp;
char buf[80];
int sum = 0;
if ((fp = fopen("numb.s", "r")) == NULL) {
fprintf(stderr, "file not found...\n"); exit(1);
}
while(fgets(buf, sizeof(buf), fp) != NULL) {
sum += get_token_sum(buf);
}
fclose(fp);
printf("Sum of token = %d\n", sum);
}
int get_token_sum(char *bp)
{
char *cp;
int i;
char *what;
int res;
int sum=0;
for(cp = strtok(bp, " \t\n"); cp != NULL; ) {
if(cp[0]=='X'){ //16진수 변환
res=0;
int len = strlen(cp);
for(i=2; i<len-1; i++){
if('A'<=cp[i]&&cp[i]<='F')
cp[i]+=10-'A';
else
cp[i]-='0';
res+=cp[i]*pow(16,len-2-i);
}
sum+=res;
}
else if(cp[0]=='C'){ //16진수 아스키코드 -->10진수로 변환
res=0;
int len = strlen(cp);
for(i=2; i<len-1; i++){
if('A'<=cp[i]&&cp[i]<='F')
cp[i]+=10-'A';
else
cp[i]-='0';
res+=cp[i]*pow(16,len-2-i);
}
sum+=res;
}
else{ //그냥 숫자일때
int num;
num = atoi(cp);
sum+=num;
}
cp = strtok(NULL, " \t\n");
}
return(sum);
}
'C' 카테고리의 다른 글
Kruskal MST (0) | 2019.07.01 |
---|