dbm 데이터베이스 소스 파일 실행 시 출력 결과가 이상합니다.

embeddeds0의 이미지

1 #include
2 #include
3 #include
4 #include
5 #include
6 /* 시스템에 따라서는 위의 줄을 다음 줄로 대체해야 할 수도 있다
7 #include
8 */
9
10 #include
11
12 #define TEST_DB_FILE "/tmp/dbm1_test"
13 #define ITEMS_USED 3
14
15 struct test_data {
16 char misc_chars[15];
17 int any_integer;
18 char more_chars[21];
19 };
20
21 int main()
22 {
23 struct test_data items_to_store[ITEMS_USED];
24 struct test_data item_retrieved;
25
26 char key_to_use[20];
27 int i, result;
28
29 datum key_datum;
30 datum data_datum;
31
32 DBM *dbm_ptr;
33
34 dbm_ptr = dbm_open(TEST_DB_FILE, O_RDWR | O_CREAT, 0666);
35 if (!dbm_ptr) {
36 fprintf(stderr, "Failed to open database\n");
37 exit(EXIT_FAILURE);
38 }
39
40 // items_to_store 배열에 자료 항목들을 기록한다.
41 memset(items_to_store, '\0', sizeof(items_to_store));
42 strcpy(items_to_store[0].misc_chars, "First!");
43 items_to_store[0].any_integer = 47;
44 strcpy(items_to_store[0].more_chars, "foo");
45
46 strcpy(items_to_store[1].misc_chars, "bar");
47 items_to_store[1].any_integer = 13;
48 strcpy(items_to_store[1].more_chars, "unlucky?");
49
50 strcpy(items_to_store[2].misc_chars, "Third");
51 items_to_store[2].any_integer = 3;
52 strcpy(items_to_store[2].more_chars, "baz");
53
54 /* 각 자료에 대해 이후 참조를 위한 키를 생성한다.
55 여기서는 각 자료 항목 문자열의 첫 글자와 일련번호를
56 조합한 것으로 키를 사용한다. */
57 for(i = 0; i 58 sprintf(key_to_use, "%c%c%d",
59 items_to_store[i].misc_chars[0],
60 items_to_store[i].more_chars[0],
61 items_to_store[i].any_integer);
62
63 // 키와 자료를 설정하고 이를 이용해서 데이터베이스에 저장한다.
64 key_datum.dptr = (void *)key_to_use;
65 key_datum.dsize = strlen(key_to_use);
66 data_datum.dptr = (void *)key_to_use;
67 data_datum.dsize = sizeof(struct test_data);
68
69 result = dbm_store(dbm_ptr, key_datum, data_datum, DBM_REPLACE);
70 if(result != 0) {
71 fprintf(stderr, "dbm_store failed on key %s\n", key_to_use);
72 exit(2);
73 }
74 }
75
76 /* 자료가 정상적으로 저장되었는지 확인하기 위해 앞서 저장한 자료 항목들
77 하나를 조회해 본다. */
78 sprintf(key_to_use, "bu%d", 13);
79 key_datum.dptr = key_to_use;
80 key_datum.dsize = strlen(key_to_use);
81
82 // 기존의 데이터베이스에서 해당 키에 해당하는 데이터를 찾는다.
83 data_datum = dbm_fetch(dbm_ptr, key_datum);
84 if (data_datum.dptr) {
85 printf("Data retrieved\n");
86 // test_data 구조체에 dptr에 저장되어 있는 데이터를 dsize만큼 초기화
87 memcpy(&item_retrieved, data_datum.dptr, data_datum.dsize);
88 printf("Retrieved item - %s %d %s\n",
89 item_retrieved.misc_chars,
90 item_retrieved.any_integer,
91 item_retrieved.more_chars);
92 }
93 else {
94 printf("No data found for key %s\n", key_to_use);
95 }
96 dbm_close(dbm_ptr);
97 exit(EXIT_SUCCESS);
98 }
99

위의 소스는 dbm 데이터베이스를 생성해서 자료를 저장하고 키에 해당하는 데이터를 찾아서
조회하는 프로그램인데요.

이 프로그램을 컴파일 하면 아무 에러없이 잘 실행되는데,
실행 결과를 보면

root@johyewon:/home/johyewon# ./dbm1
Data retrieved
Retrieved item - bu13 -487894616 �

위와 같이 뜨네요.. 원래
Data retrieved
Retrieved item - bar 13 unlucky? 라고 떠야 정상인데 그 일련번호가 뜨면서 에러가 나네요.

뭐가 문제인건가요??

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.