보시면 아시겠지만 파싱입니다. 제가 여쭤보고싶은건 빨간색으로 표시했습니다.
CODES 부분이 지금 char codes[CODES] 부분에 들어있습니다.
들어있는 내용은 예를들어 150010301810270C10393C101E00103018102A0C1039
지금은 이렇게 char 형이 들어있어서 int 형으로 변환해서 출력하려고 합니다.
그래서 change(char형 코드배열, int형 코드배열) 함수 생성한 뒤
함수에서 형변환을 마치고 리턴 값은 int형으로 받아서
fprintf("%d", int 코드배열)로 하려고하는데 지금 제 소스에서는 segmentation fault 가 발생하네요
혹시 해결할 수 있는 분 있나요 ? ? ? 정해진 방법없습니다.ㅋㅋㅋ
개인적으로 함수를 쓰고싶다는. . . ..
-------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#define LINESIZE 80
#define TAG 1
#define PROGRAMNAME 6
#define ADDR 6
#define SIZE 6
#define LENGTH 2
#define CODES 60
#define LABELSIZE 9
#define OTHERS 60
int change(char *s, int *i);
int main(int argc, char *argv[]) {
char cline[LINESIZE];
char tag[TAG];
char programname[PROGRAMNAME];
char addr[ADDR];
char size[SIZE];
char length[LENGTH];
char label[LABELSIZE];
char others[OTHERS];
char *cptr = NULL;
FILE *rfd, *wfd;
char codes[CODES];
int ch_int[CODES];
int i = 0;
rfd=fopen(argv[1],"r");
wfd=fopen(argv[2],"w");
while(fgets(cline, LINESIZE, rfd) > 0) {
cptr = cline;
if(*cline == 'H') {
strncpy(programname,cptr+TAG,PROGRAMNAME);
programname[PROGRAMNAME]='\0';
cptr = cline+TAG+PROGRAMNAME;
strncpy(addr,cptr,ADDR);
addr[ADDR]='\0';
cptr = cline+TAG+PROGRAMNAME+ADDR;
strncpy(size,cptr,SIZE);
size[SIZE]='\0';
fprintf(wfd,"TAG : %c, PROGRAM NAME : %s, ADDR : %s, SIZE : %s", *cline, programname, addr, size);
if(size[strlen(size)-1] != '\n') {
fprintf(wfd,"\n");
}
}
else if(*cline == 'T') {
strncpy(addr,cptr,ADDR);
addr[ADDR]='\0';
cptr = cline+TAG+ADDR;
strncpy(length,cptr,LENGTH);
length[LENGTH] ='\0';
cptr = cline+TAG+ADDR+LENGTH;
strncpy(codes,cptr,CODES);
codes[CODES] ='\0';
cptr = cline+TAG+ADDR+LENGTH+CODES;
fprintf(wfd,"TAG : %c, ADDR : %s, LENGTH : %s, CODES : T%x", *cline, addr, length,change(codes, ch_int));
if(size[strlen(size)-1] != '\n') {
fprintf(wfd,"\n");
}
}
else if(*cline == 'M' || *cline == 'E') {
strncpy(addr,cptr,ADDR);
addr[ADDR]='\0';
cptr = cline+TAG+ADDR;
strncpy(length,cptr,LENGTH);
length[LENGTH] ='\0';
cptr = cline+TAG+ADDR+LENGTH;
strncpy(codes,cptr,CODES);
codes[CODES] ='\0';
cptr = cline+TAG+ADDR+LENGTH+OTHERS;
fprintf(wfd,"TAG : %c, ADDR : %s, LENGTH : %s, OTHERS : %s", *cline, addr, length, codes);
if(size[strlen(size)-1] != '\n') {
fprintf(wfd,"\n");
}
}
strcpy(programname, " ");
strcpy(addr, " ");
strcpy(size, " ");
strcpy(codes, " ");
}
fclose(rfd);
fclose(wfd);
return 0;
}
int change(char *s, int *i)
{
int *ii = NULL;
ii = i;
while(s != NULL) {
if(*s >= 48 && *s <= 57) {
*i = *s - 48;
}
else if(*s >= 65 && *s <= 70) {
*i = *s - 55;
}
*s++;
*i++;
}
i = ii;
return *i;
}
*s++;
*i++;
이거 뭐죠? 도저히 이해가 안가는데요.... s++이나 i++로 하면 모를까....
그리고 while문 조건도 이상하네요. *이 들어가야 하는 자리랑 안들어가야 하는 자리가 제대로 안되어있네요.
포인터 개념 공부좀 다시하세요.
그리고 하고 싶으신것이 char로 되어있는 16진수를 int로 변환하시는것이라면
추가로 되어야 하는 내용이 빠졌습니다.
우선 change 하신 숫자들을 순서대로 16의 (n-1)승~16의 0승 까지 곱해서 합쳐야 int가 되겠죠.
여기서 자릿수가 넘어가는 케이스도 존재하게 되는데요. 그런 경우는 int를 long으로 하고 그래도 안되면 double로 하고..
그래도 안된다면 큰 수치를 연산할 수 있는 구조를 스스로 작성하셔야 합니다. BigInteger같은걸로 검색하시면 나올지도...
그리고 만약 int의 범위로만 가능한 숫자라면 atoi 라는 함수도 있습니다.