안녕하세요 변수를 비교 할려고 하는데요 .. 잘 안되네요.

facered79의 이미지

비교할 대상인 변수는 아래와 같습니다.

const char **current_id;
char *comval;
//current_id[1] 에는 "01" 이라는 값이 들어있고.
//comval도 마찬가지로 "01"이 들어있습니다.

이 둘을 비교 하기 위해서는 어떤 방법을 써야 하는지요..

서지훈의 이미지

strcmp(cyrrent_id[1], comval) 아마 이거면 될 듯...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

facered79의 이미지

세그멘테이션 폴트가 뜨네요..

서지훈의 이미지

그럼... 관련 부분 소스들도 좀 올려 주세요.
위 변수 선언 부분과 메모리 잡는 부분과 비교부분까지...
간단한 거라면 전체를 올려 주셔도 좋구요.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

facered79의 이미지

#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() 함수가 전체적으로 문제가 많네요.
*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도 바른 표현은 아닙니다.
이같은 경우 strcpy()를 이용해서 값을 복사 해주는 것이 정석적인 표현이 될듯 하군요.

그리고 위에 응급한 아래부분에서...

Quote:

하면은 이 pointer의 주소값을 변경을 할 수가 없도록 하기 위해 사용하는 것입니다.
그런데 전체적으로 선언은 이렇게 하고 규칙은 지키시지 않은듯 합니다.

이넘에서 "pointer의 주소값"도 그냥 "pointer"로 변경을...
여기 호사가들 많아서 시끄러워 질 수도 있음...ㅋㅋ

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

happycat의 이미지

먼저 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'; 이렇게 할당하는 걸 막을 수가 없죠.. 당연 프로그램은 버스 에러나 세그폴로 죽게 됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.