파싱문제여...

익명 사용자의 이미지

예를 들면 다음과같거든여...
string => "id password ip a1 a2 a3...."
a1, a2, a3는 각각 가변적으로 길이가 변할수 있는 것들이구여...
strchr()함수를 사용해봤는데 잘 안되는군여...
이번기회에 파싱하는 함수를 만들려구 하는데 idea가 잘 안떠오르네여..
각각 포인터변수 ID, PASSWORD, IP, A1, A2, A3에 값을 넣고 싶은데
어떻게 접근하면 좋을지...좋은 의견부탁드립니다...

익명 사용자의 이미지

혹시 strtok 를 사용하여야 하는것인지 모르겠네요.
만약 strtok 가 맞다면
검색에서 strtok 검색하면 되구요..

혹시해서 Glibc 메뉴얼의 내용을 올립니다.

함수 char * strtok (char *newstring, const char *delimiters)
string은 호출된 일련의 strtok함수를 통해 토큰들로 분리되어 질수 있다.분리시킬 문자열을 오직 첫 번
째 호출에서 newstring 인수로 인식된다. strtok함수는 내부적 상황 정보를 맞추기 위해 이것을 사용한다. 같은 문자
열에서 부가적으로 토큰을 얻기위해 다음 호출을 할 때는 newstring인수로 널포인터를 주어서 지정시킨다. 당신이
strtok를 호출한뒤에 어떤 라이브러리 함수
도 strtok를 호출하지 않았음을 보장한다.delimiters인수는 추출될 토큰을 둘러싸고 있는 구획문자의 셋을 지정한 문
자열이다. 이 문자열 셋에서 첫 번째 문자들은 버려진다. 이 구획문자 셋의 멤버가 아닌 첫 번째 문자는 다음 토큰
의 시작
을 표시한다. 토큰의 끝은 구획문자 셋의 멤버인 다음 문자를 찾음으로서 발견된다. newstring인수로 쓰여진 원래
의 문자열안의 이 문자는 널 문자로 다시 쓰여지고 newstring안의 토큰의 시작점을 가리키는 포인터를 리턴한다. (
제가 이해한바에 따르면 구획문자를 찾아서 토큰을 얻으면 그 구획문자는 널문자로 대체시켜 버린다는 말인 것 같은
데... 아마 맞을걸요...? )
strtok의 다음 호출에서 다음 문자의 시작점은 전의 토큰의 끝으로 표시된 점을 하나 지난 지점이다. 구
획문자의 셋들을 일련의 strtok 호출에서 모든 호출이 모두 같은 것은 아님을 기억하라. (즉, 구획문자열들은 strtok
를 호출할 때 마다 달라도 된다는 얘기) 만일 newstring 문자열의 끝에 도달되었거나 문자열의 나머지가 오
직 구획문자로만 구성되어 있다면 strtok는 널포인터를 리턴한다.
주의 strtok는 파싱하는 문자열을 변화시킨다, 그러므로 당신은 항상 strtok로 파싱하기 전에 임시 버퍼에 문자열
을 복사해 놓아야 한다. 만약 당신이 당신 프로그램의 다른 부분에서 온 문자열을 수정하도록 strtok에 허용하면 당
신이 스스로 문제를 자처하는 것이다; 그 문자열은 strtok에 의해 변형되어 파싱하는 동안 그 데이터가 다른 목적으
로 사용되어 질수도 있다. 심지어 상수일지도 모르는 문자열에 당신이 명령을 내리면 strtok는 그것을 수정하려
시도할 것이고 당신의 프로그램은 결국 ROM(read only memery)에 쓰기를 시도하므로 심각한 에러신호를 얻을 것이
다. 21.2.1절 [Program Error Signals] 273페이지 참조. 이것은 일반적인 원칙의 특별한 경우이다 만일 프로그램
의 일부분이 어떤 데이터 구조체를 수정하려는 목적을 가지고 있지 않다면 그것을 임시적으로 수정하려 할 때 에러
가 발생하는 경향이 있다. strtok함수는 재진입하지 않는다. 21.4.6절 [Nonereentrancy] 290페이
지, 재진입하는 이유나 위치의 중요성에 대한 논의를 위해, 여기에 strtok의 간단한 사용예가 있다.
#include
#include
. . .

char string[] = "words separated by spaces -- and, punctuation!";
const char delimiters[] = " .,;!-";
char *token;
. . .

/* 여기서 구획문자는 공백(" ") 과 콜론, 세미콜론, 느낌표, 데쉬("-")
이네요... */
token = strtok (string, delimiters); /* token => "words" */
token = strtok (NULL, delimiters); /* token => "separated" */
token = strtok (NULL, delimiters); /* token => "by" */
token = strtok (NULL, delimiters); /* token => "spaces" */
token = strtok (NULL, delimiters); /* token => "and" */
token = strtok (NULL, delimiters); /* token => "punctuation" */
token = strtok (NULL, delimiters); /* token => NULL */
/* strtok는 구획문자가 나오면 그것을 토큰으로 잘라서 리턴시키네
요.... */

익명 사용자의 이미지

ANSI C 라이브러리에 있는 strtok()은
문자열 버퍼의 내용을 건드리기 때문에
원래의 문자열 버퍼의 내용을 유지하고자 하려면
백업버퍼를 하나 더 두어야 하는 불편함이 있고,
동작시 내부적으로 static 변수를 사용하기 때문에
이중 루프 같은데에서 겹쳐서 호출하거나,
멀티스레딩에서 에러가 생기는 결정적인 단점이 있습니다.
(thread-safe한 strtok_r() 함수가 glibc에는 있지만,
ANSI C 호환이 아니므로 gcc가 아닌 다른 컴파일러에서는 쓸 수 없습니다.
가능한 한 ANSI C/C++ 호환으로 작성하시는 것이 좋습니다.)

C++ 사용자시라면, ANSI C++ string 클래스의,
stdstringfind_first_of()와 stdstringfind_first_not_of()
멤버 함수를 사용하여, 간단히 토크나이저(tokenizer)를 구현해서 쓰시던가,
Boost C++ Library (http//boost.org)의 tokenizer 클래스를 써보실 것을 권합니다.

댓글 달기

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