C 언어 간단한거 질문좀 드려도될까요?

sacredone의 이미지

파싱하여 탐색하는걸 만드려고하는데요

pattern.txt 파일이 있습니다

이 파일에는

abc hello
def hi
ghi hello

이렇게 3줄이 있습니다

프로그램은
"문자열.문자열" 형태로 입력을 받습니다

예를들어 "hi.def" 로 입력을 했다고 하면
입력받은 문자열의 점을 기준으로 왼쪽에 있는 문자열과
프로그램이 연 pattern.txt 파일에서 한줄을 읽어서 공백을 기준으로 우측에있는 문자열과 비교합니다
첫번째 줄은 "abc hello" 이므로 공백의 우측 문자열인 "hello" 와 입력받은 "hi" 를비교해서
같지 않기 때문에 다음 문자열로 넘어갑니다

두번째 문자열의 "def hi" 에서 공백을 기준으로 우측 문자열인 "hi" 와 입력받은 "hi" 를 비교해서
같기 때문에 입력받은 문자열의 점을 기준으로 우측 문자열인 "def" 와
파일 두번째 줄에서 읽은 문자열의 공백 좌측 문자열인 "def" 와 비교해서
같으면 같다 틀리면 틀리다 라고 출력합니다

근데 입력을 "hello.ghi" 라고 주면

위의 알고리즘대로라면
먼저 입력받은 문자열에서 점 좌측문자열인 "hello" 와
프로그램이 연 파일의 첫줄부터 비교해서
첫번째 줄의 공백 우측문자열인 "hello" 와 비교해서 일치하니까 바로 입력받은 문자열의 공백 우측인
"ghi" 와 파일의 "abc" 를 비교해서 틀리니까 틀리다 라고 표시합니다

이럴때
enum 을 사용하여 pattern.txt 파일에서 공백 좌측의 문자열들을
묶어줄수 있을까요?

예를들어 파일의 공백 좌측 문자열들 중에서
우측 문자열이 같은 것들끼리 enum 으로 묶는다면

"hello.ghi" 를 입력해도 첫번째 줄에서 "abc" 와 매칭하여 틀리더라도

ghi 와 abc 를 enum 으로 어떻게 같다고 할수있으면 같다라는 결과를 내게 하고싶습니다

가능할까요..?

이해하기 힘드시다면 죄송합니다 ㅠ

sohn9086의 이미지

글 안에 답이 보이는데요...

파일안에 hello가 여럿 존재할 수 있음에도 불구하고 맨 처음 발견한 hello의 왼쪽값과 유저가 입력한 hello.의 오른쪽 값만 비교해서 틀리니까 루프를 나와버려서 그런거네요. 한 번 실패하더라도 파일안에 다른 hello가 있을 수 있으니까 파일 끝까지 찾아보고 그래도 없으면 실패.

음... 그리고 제가 검색쪽에 전문가는 아니지만 한 마디 덧붙인다면 알고리즘 자체를 다시 생각하시는 게 좋을겁니다.
(물론 파일 크기와 용도에 따라 다릅니다. 단순히 공부를 위한 것이라면 죄송.)

저렇게 linear하게 검색해서는 키 값에 따라 검색 반응속도가 달라지죠. (파일 처음부분에 있다면 빨리 튀어나오겠지만, 마지막 부분에 있다면?)

보통은 해쉬 테이블 같은 걸 작성해서 파일 사이즈에 관계없이 일정한 속도로 키에 해당하는 밸류를 찾도록 할 겁니다.

생산적인 댓글을 달자

sacredone의 이미지

파일안에
우측 문자열이 같은것이 두개이상일경우

제일 처음 우측문자열과 입력한 좌측문자열이 일치할경우

루프를 나와버리고 맞다 틀리다 결과를내게 만들었는데

enum 을 사용해서 데이터를 묶어두면 알고리즘 수정없이 어떻게 가능하지않을까요

sohn9086의 이미지

"데이터를 묶는다" 라는 발상은 틀린게 아닌데, 그 수단이 왜 enum인지 이해가 안되네요.

해쉬를 사용한다는게 무슨 뜻인지는 이해하셨나요?

생산적인 댓글을 달자

HDNua의 이미지

떠오르는 대로 코드를 짜봤는데, 어떤 부분에서 어떻게 되면 좋을지 말씀해주세요.
처음에 딕셔너리 생각을 하고 짜다가 키 값 중복도 못 막고 그러기에
이름을 딕셔너리를 의미하는 Dict에서 List로 바꿨습니다. 혹시 안 바꾼 부분이 있을지 몰라서요.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ARR_MAX     256
#define LIST_MAX    3
 
typedef struct _listElem        // List Element
{
    char *key;
    char *value;
} LElem;
 
typedef LElem List[_MAX];
 
void LElemShow(const LElem *pelem);
void LElemDealloc(LElem *pelem);
void ListShow(const List *plist);
void ListDealloc(List *plist);
 
int main(void) // (int argc, const char* argv[])
{
    int i = 0;
    FILE *fptr;
    char *strptr;
    char tmpArr[ARR_MAX];
    char *tmpArgv;
    List list;
    LElem target;
 
    int argc = 3;
    const char* argv[] = {"./121114C", "Test.txt", "hello.ghi"};
 
    // 1. Usage Exception
    if (argc<3)
    {
        printf("Usage: ./121114C <TARGET_FILE_NAME> <KEY>.<VALUE>\n");
        return -1;
    }
 
    // 2. File Open Exception
    fptr = fopen(argv[1], "rt");
    if (!fptr)
    {
        printf("Error: Cannot find the file named %s\n", argv[1]);
        return -1;
    }
 
    // Process
    tmpArgv = (char *)calloc(sizeof(char), strlen(argv[2])+1);
    strcpy(tmpArgv, argv[2]);
    strptr = tmpArgv;
    target.key = strdup(strtok(strptr, "."));
    target.value = strdup(strtok(0, "\0"));
 
    printf("Target: \n");
    LElemShow(&target);
    free(tmpArgv);
 
    //    printf("%s%s2", target.key, target.value);
 
    strptr = fgets(tmpArr, ARR_MAX, fptr);
    while (strptr)
    {
//        printf("String: %s\n", tmpArr);
        list[i].value = strdup(strtok(strptr, " "));
        list[i].key = strdup(strtok(0, "\n"));          // function fgets includes newline character '\n'
 
//        printf("%s%s2", dict[i].key, dict[i].value);
 
        if (!strcmp(list[i].key, target.key))
        {
            printf("For key %s: ", target.key);
            if (!strcmp(list[i].value, target.value))
                printf("It is same\n");
            else
                printf("It is not same\n");
        }
 
        ++i;
        strptr = fgets(tmpArr, ARR_MAX, fptr);
    }
 
    printf("List: \n");
    ListShow(&list);
 
    LElemDealloc(&target);
    ListDealloc(&list);
    return 0;
}
 
void LElemShow(const LElem *pelem)
{
    printf("Key: %s\n", pelem->key);
    printf("Value: %s\n", pelem->value);
}
void LElemDealloc(LElem *pelem)
{
    free(pelem->key);
    free(pelem->value);
}
void ListShow(const List *plist)
{
    int i;
    for (i=0; i<LIST_MAX; ++i)
        LElemShow(*plist+i);
}
void ListDealloc(List *plist)
{
    int i;
    for (i=0; i<LIST_MAX; ++i)
        LElemDealloc(*plist+i);
}
[/]

저는 이렇게 생각했습니다.

sacredone의 이미지

전체탐색 말곤 답이없을까요

shint의 이미지

이 글은 마치. 일종에 언어해석기 같습니다.
프로그램을 언어화(한글등) 하는 자동화 프로그램 형식이라고 생각됩니다.
아니면. 외국사람이 한국어로 번역기를 사용했거나요??

하튼. 읽어보면.

//pattern.txt
abc hello
def hi
ghi hello

//설명.
1. 입력값 왼쪽과 첫줄에서 읽은값 우측
2. 입력값 왼쪽과 두번째줄에서 읽은값 우측
3. 입력값 우측과 두번째줄에서 읽은값 좌측

//"문자열.문자열" 입력
var input_all = "hi.def";

입력받은 문자열의 점을 기준으로 왼쪽에 있는 문자열
var input_left = "hi";
var input_right = "def";

//프로그램이 연 pattern.txt 파일에서 한줄을 읽어서 공백을 기준으로 우측에있는 문자열과 비교합니다
var string_right = "hello";

//공백의 우측 문자열인 "hello" 와 입력받은 "hi" 를비교해서
if(string_right == input_left)
{
return;
}
else
{
//같지 않기 때문에 다음 문자열로 넘어갑니다
}

//두번째 문자열의 "def hi" 에서 공백을 기준으로 우측 문자열인 "hi" 와
var string_right2 = "hi";

//입력받은 "hi" 를 비교해서 : input_left
if(string_right2 == input_left)
{
//같기 때문에??
질문1. 무엇이 같은건가요? 같은 경우~ 를 의미하는건가요?

//입력받은 문자열의 점을 기준으로 우측 문자열인 "def" 와 : input_right
//파일 두번째 줄에서 읽은 문자열의 공백 좌측 문자열인 "def" 와 비교해서 : def hi
var string_def = "def";
//같으면 같다 틀리면 틀리다 라고 출력합니다

if(input_right == string_def)
{
//같다.
}
else
{
//틀리다.
}

}
-------------------------------
//프로그램 종료.
-------------------------------

//근데 입력을 "hello.ghi" 라고 주면
재시작.

//pattern.txt
abc hello
def hi
ghi hello

//설명.
1. 입력값 왼쪽과 첫줄에서 읽은값 우측
2. 입력값 왼쪽과 두번째줄에서 읽은값 우측
3. 입력값 우측과 두번째줄에서 읽은값 좌측

//결과
hello - hello
hello - hi
ghi - def

-----------------------------------------------------
//위의 알고리즘대로라면
//먼저 입력받은 문자열에서 점 좌측문자열인 "hello" 와
//프로그램이 연 파일의 첫줄부터 비교해서

var input_left = "hello";
var string_all = "abc hello";
var string_right = "hello";

//첫번째 줄의 공백 우측문자열인 "hello" 와 비교해서 일치하니까
//바로 입력받은 문자열의 공백 우측인 "ghi" 와 파일의 "abc" 를 비교해서 틀리니까 틀리다 라고 표시합니다
- 이건 틀린 말입니다. 위의 공식에 따르면. 여기서 abc는 hello 여야 합니다.

//이럴때
//enum 을 사용하여 pattern.txt 파일에서 공백 좌측의 문자열들을
묶어줄수 있을까요?
- abc def ghi 이렇게 말인가요?

//예를들어 파일의 공백 좌측 문자열들 중에서
//우측 문자열이 같은 것들끼리 enum 으로 묶는다면
- 어떻게 묶을까요??

//"hello.ghi" 를 입력해도 첫번째 줄에서 "abc" 와 매칭하여 틀리더라도
-- hello와 매칭이 틀리더라도.

//ghi 와 abc 를 enum 으로 어떻게 같다고 할수있으면 같다라는 결과를 내게 하고싶습니다
//가능할까요..?

- 여기서 abc는 hello로 여겨집니다.

결론.
공식은 가능하지만.
어떤것을 어떻게 묶어야 하는지에 대한 설명과
중간중간 오류적인 공식문법등이
충분히 설명되야 할거 같습니다.

이 글의 작성자가.
프로그램의 초보이거나
불편하신 분의 글이기를 바랍니다.

그렇지 않고. 장난 글이나 쓰는 쓰레기는 아니기를 바랍니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

sacredone의 이미지

그냥 초보개발자인 한국사람이 한국회사에서 컨텐츠 확장자 불일치 탐지모듈 만들다가 올린 질문입니다

"입력파일의 컨텐츠에 해당하는 실제 확장자" + "공백" + "입력파일의 컨텐츠의 아웃풋"

으로 이루어진 패턴파일에

입력으로 파일이름을 주면 그 파일의 내용에 해당하는 확장자를 추출하여

그 확장자를 입력으로 받은 파일이름에 있을 . 뒤의 확장자와 비교하는 모듈 개발중에

wma, wmv, asf 등의 파일들은 컨텐츠 아웃풋이 동일해서

저 확장자들은 같이 취급하고싶은데

(ex : test.wma, test.asf 둘다 컨텐츠와 확장자 일치)

그게 안되서 질문한건데 제가 언어가 딸려서 죄송합니다

snowall의 이미지

두 짝 (x, y)를 입력받아서 (x1, y1), (x2, y2), ...에 있나 없나 찾는 과정이네요.

그냥 오류 내지 말고 리스트에 있는걸 전부 다 찾아서 돌아가거나

오른쪽 짝이 같은 것들을 다 묶어서 (x1, (y11, y12, y13, ...)), (x2, (y21, y22, y23, ...)) ... 이런식으로 자료를 만들어 두면 될 것 같은데요.

abc든 ghi든 hello만 같으면 같다고 출력하고 싶다면, 처음부터 사전의 왼쪽 단어와 입력의 오른쪽 단어들을 비교할 필요조차 없는 거겠죠.

피할 수 있을때 즐겨라! http://melotopia.net/b

sacredone의 이미지

한번 탐색에 성공했다고
(맞든 틀리든 유저가 입력한값의 점 좌측문자열이나 파일의 공백 우측문자열 비교해서 같을경우)

멈추지않고 계속 찾아돌리는것을 생각했는데
사실 제가 본문에선 파일에 3줄이라고해놨는데 꽤 많구
입력도 문자열 한개가아니라 엄청나게 많아질수도있어서
처음 비교가 같은것들을 전부찾아내는 방법은 제외하였습니다...

오른쪽 짝이 같은 것들을 다 묶는다고 말씀하셨는데
enum 열거형 변수를 사용해서 가능한걸까요?

댓글 달기

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