strcmp는 문자열 시교시 (char *)의 문자열이 되어야 하나...
비교를 한건 (char **)문자열 집합을 비교한 점...
이 모든게 문제 입니다.
나머지 코드들은 다 못 봐서 모르겠지만...
전체적으로 한 번 꼼꼼히 살펴보시길바랍니다.
그리고 const를 너무 남발 하시는거 같은데...
Warnning메시지 넘쳐 나지 않나요?
이거 컴파일 무사히 끝나도 아마도 Warnning은 좀 많을듯 보입니다. const char *variable;
하면은 이 pointer의 주소값을 변경을 할 수가 없도록 하기 위해 사용하는 것입니다.
그런데 전체적으로 선언은 이렇게 하고 규칙은 지키시지 않은듯 합니다.
그리고 윗 분이 const에 대해 지적해 주셨는데 원 코드에서 const를 사용한 것은 아무 문제가 없어보입니다.
const char* temp;
이런식으로 선언되어 있으면 temp가 가르키는 값을 수정할 수 없는 것이지 temp를 수정할 수 없는 것이 아닙니다. 포인터 temp 자체를 const로 만들려면 아래와 같이 써야 합니다.
char* const temp;
즉.. 위에 처럼 const char** temp; 이렇게 썼다면,
temp[0] = "abc";
는 가능하지만
temp[0][0]='a';
이건 불가능하죠. 전체적으로 코드를 보면 const 변수로 가르키는 문자열을 수정하는 부분은 없기 때문에 문제는 없어 보입니다. 저는 constness는 되도록 지켜주는 편이 좋다고 생각합니다. (그런데 이런 얘기 하면 호사가가 되는건가요?;;)
그리고 지훈님께서 temp[1]="01"; 을 strcpy로 해 주는 것이 정석적인 표현이라고 하셨습니다. 네, 일단 공감은 하고요, 다만 "01"이 메모리상에 위치하는 부분을 정확히 이해하고 사용하면 위험할 건 없다고 봅니다. "01"은 메모리 구조에서 Text 영역에 위치하고 있고 Read-Only memory 입니다. 때문에 const char* 로 가르켜서 읽기 전용으로 사용하기에 적합한 메모리이죠. 또한 strcpy나 strdup에 비교하면 문자열에 필요한 메모리를 아낄 수 있다는 장점도 있습니다.
하지만 이 차이점을 정확히 이해하지 못한다면 추가적인 비용이 들더라도 strcpy, strdup을 쓰는 것이 정석적입니다. char* temp = "01"; 이런식으로 쓴 다음에 temp[0]='a'; 이렇게 할당하는 걸 막을 수가 없죠.. 당연 프로그램은 버스 에러나 세그폴로 죽게 됩니다.
[code:1]strcmp(cyrrent_id[1]
strcmp(cyrrent_id[1], comval)아마 이거면 될 듯...<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
그리 해봤는데요..
세그멘테이션 폴트가 뜨네요..
그럼... 관련 부분 소스들도 좀 올려 주세요.위 변수 선언 부분과
그럼... 관련 부분 소스들도 좀 올려 주세요.
위 변수 선언 부분과 메모리 잡는 부분과 비교부분까지...
간단한 거라면 전체를 올려 주셔도 좋구요.
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
소스입니다.
#include <stdio.h> #include <expat.h> #include <stdio.h> #include <string.h> #define BUFFSIZE 8192 char Buff[BUFFSIZE]; int Depth = 0; int is_value = 0; char *sensortype="01"; char *eventtype="01"; char *eventoffset="02"; const char *current_el; // 가장 최근 태그 기억용 const char **current_id; // 태그의 특성값 기억용 int blacklist_num = 0; // 몇개의 레코드가 저장되었는지 검사 // xml (태그가 아닌) 데이터를 만났을 때 호출된다. void parser(void *data, const char *s, int len) { int i = 0; int index = 0; char buf[1024] = {0x00, }; // 개행,탭문자 제거 for (i = 0; i < len; i++) { if (s[i] != '\n' && s[i] != '\t' && i < len) { buf[index] = s[i]; index++; } } if (is_value && current_el && (buf[0] != 0x00)) { if (strcmp(current_el,"key") == 0) { printf("==================\n"); blacklist_num++; } /* if (current_id[0]) printf("==> %s : %s (%s)\n", current_el, current_id[3], buf); else printf("==> %s (%s)\n", current_el, buf); */ } } // xml (여는)태그를 만났을 때 호출되는 함수다. // depth를 1증가 시키고, depth가 0즉 처음 만나나는 테그라면 // version을 검사한다. 물론 테그(el)를 직접 비교해도 될 것이다. void start(void *data, const char *el, const char **attr) { is_value = 1; current_id = attr; const char *temp_id; temp_id=current_id[1]; const char **temp; // 이부분에서 비교를 해주야 합니다.. // current_id[1]의 값을 찍어보면 01 로 나오고 // if 문에서 temp_id 의 값과 같으면 어떤 작업을 수행하라 이 // 게 목적인데요.. 어찌해야 할까요;; *temp[1]=="01"; //printf("temp_id is %s\n",temp_id); //if(strcmp(el,"01")==0) //printf("current id is %s\n",current_id[1]); if(strcmp(temp_id,temp)) { // if(strcmp(current_id[1],eventtype)==0 ) printf("hello\n"); } current_el = el; // current_id = attr; if(Depth == 0) { printf("Configuration Version is %s\n\n", current_id[1]); } Depth++; } // xml (닫는)태그를 만났을 때 호출되는 함수다. // 닫히게 되므로 depth가 1감소할 것이다. void end(void *data, const char *el) { is_value = 0; Depth--; } int main(int argc, char **argv) { // xml 파서를 생성한다. XML_Parser p = XML_ParserCreate(NULL); if (! p) { fprintf(stderr, "Couldn't allocate memory for parser\n"); exit(-1); } // xml의 element를 만났을 때 호출될 함수를 등록한다. // start는 처음태그, end는 마지막 태그를 만났을 때 호출된다. XML_SetElementHandler(p, start, end); // 실제 데이터 (예 : <tag>data</tag>의 data)를 처리하기 위해서 // 호출될 함수를 등록한다. XML_SetCharacterDataHandler(p, parser); for (;;) { int done; int len; len = fread(Buff, 1, BUFFSIZE, stdin); if (ferror(stdin)) { fprintf(stderr, "Read error\n"); exit(-1); } done = feof(stdin); if (! XML_Parse(p, Buff, len, done)) { fprintf(stderr, "Parse error at line %d:\n%s\n", XML_GetCurrentLineNumber(p), XML_ErrorString(XML_GetErrorCode(p))); exit(-1); } if (done) break; } printf("\n\n리스트의 크기 : %d\n", blacklist_num); return 0; }소스를 보니 일단은 start() 함수가 전체적으로 문제가 많네요.[
소스를 보니 일단은 start() 함수가 전체적으로 문제가 많네요.
*temp[1]=="01";일다은 temp의 공간 확보도 해주시지 않으시고 assign 을 의도 했으나 이 조차 assign이 아니라 evaluation이 된 점...
if(strcmp(temp_id,temp)) { // if(strcmp(current_id[1],eventtype)==0 ) printf("hello\n"); }strcmp는 문자열 시교시 (char *)의 문자열이 되어야 하나...
비교를 한건 (char **)문자열 집합을 비교한 점...
이 모든게 문제 입니다.
나머지 코드들은 다 못 봐서 모르겠지만...
전체적으로 한 번 꼼꼼히 살펴보시길바랍니다.
그리고 const를 너무 남발 하시는거 같은데...
Warnning메시지 넘쳐 나지 않나요?
이거 컴파일 무사히 끝나도 아마도 Warnning은 좀 많을듯 보입니다.
const char *variable;하면은 이 pointer의 주소값을 변경을 할 수가 없도록 하기 위해 사용하는 것입니다.
그런데 전체적으로 선언은 이렇게 하고 규칙은 지키시지 않은듯 합니다.
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
추가로 말씀을 드리면...temp[1]로의 "01"값 assign도
추가로 말씀을 드리면...
temp[1]로의 "01"값 assign도 바른 표현은 아닙니다.
이같은 경우 strcpy()를 이용해서 값을 복사 해주는 것이 정석적인 표현이 될듯 하군요.
그리고 위에 응급한 아래부분에서...
이넘에서 "pointer의 주소값"도 그냥 "pointer"로 변경을...
여기 호사가들 많아서 시끄러워 질 수도 있음...ㅋㅋ
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
먼저 temp를 위한 공간을 확보해 주셔야 합니다.만일 문자열을
먼저 temp를 위한 공간을 확보해 주셔야 합니다.
만일 문자열을 3개 담고 싶다면 아래와 같은 코드로 temp를 위한 공간을 확보할 수 있습니다.
const char** temp; temp = (const char**) malloc(3 * sizeof(char*));그러면 아래와 같은 코드는 문제 없이 돌아갑니다.
temp[0] = "abc";그리고 윗 분이 const에 대해 지적해 주셨는데 원 코드에서 const를 사용한 것은 아무 문제가 없어보입니다.
const char* temp;이런식으로 선언되어 있으면 temp가 가르키는 값을 수정할 수 없는 것이지 temp를 수정할 수 없는 것이 아닙니다. 포인터 temp 자체를 const로 만들려면 아래와 같이 써야 합니다.
char* const temp;즉.. 위에 처럼 const char** temp; 이렇게 썼다면,
temp[0] = "abc";는 가능하지만
temp[0][0]='a';이건 불가능하죠. 전체적으로 코드를 보면 const 변수로 가르키는 문자열을 수정하는 부분은 없기 때문에 문제는 없어 보입니다. 저는 constness는 되도록 지켜주는 편이 좋다고 생각합니다. (그런데 이런 얘기 하면 호사가가 되는건가요?;;)
그리고 지훈님께서 temp[1]="01"; 을 strcpy로 해 주는 것이 정석적인 표현이라고 하셨습니다. 네, 일단 공감은 하고요, 다만 "01"이 메모리상에 위치하는 부분을 정확히 이해하고 사용하면 위험할 건 없다고 봅니다. "01"은 메모리 구조에서 Text 영역에 위치하고 있고 Read-Only memory 입니다. 때문에 const char* 로 가르켜서 읽기 전용으로 사용하기에 적합한 메모리이죠. 또한 strcpy나 strdup에 비교하면 문자열에 필요한 메모리를 아낄 수 있다는 장점도 있습니다.
하지만 이 차이점을 정확히 이해하지 못한다면 추가적인 비용이 들더라도 strcpy, strdup을 쓰는 것이 정석적입니다. char* temp = "01"; 이런식으로 쓴 다음에 temp[0]='a'; 이렇게 할당하는 걸 막을 수가 없죠.. 당연 프로그램은 버스 에러나 세그폴로 죽게 됩니다.
댓글 달기