string parsing 에 관해서 질문드립니다.

nuri의 이미지

안녕하세요.

unix 환경이고 코딩은 c 를 가지고 합니다.

간단한 쉘을 만드는 것인데
입력받는 string 을 어떻게 파싱해야 좋을지 몰라
애를 먹고 있습니다.

aaa < bbb > ccc 를 char buf[] 로 입력을 받아서
토막토막 짤라야 하는데( aaa , < , bbb , > ccc )
어떤식으로 해야 하는지 몰라 질문드립니다.

ssggkim의 이미지

space로 구분이 되는 거라면 strtok으로 간단하게 해결됩니다.
그게 아니라면 직접 짜시던지 너무 복잡하다면 yacc등을 써야 하지 않을까요?

sozu의 이미지

위와 같은 형식으로 파싱하시는 거라면

무식하게 파싱하는 함수 만드시는게 편하실겁니다 :D

-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com

bugiii의 이미지

C++ 라면 boost 의 tokenizer 가 아주 좋습니다.

http://boost.org/libs/tokenizer/index.html

원하시는 구분자로 (쉼표, 공백 등) 구분할 수 있고, 구분자와 같이 혹은 없애고 반복자로 다음 문자를 찾게됩니다.

저자의 말로는 strtok 의 일반형이라고 하는데, 쓰레드 안전하다는 것도 좋고 반복자 형태를 지원해서 써먹기도 나름대로 좋고... 이것저것 생각해보아도 tokenizer 써보니 좋았습니다.

nuri의 이미지

답변 감사 합니다.

구분은 space 로 하면 힘들더군요.

인자가 있는 명령어일경우 제대로 파싱이 되지 않아서

< , > , | 로 해야 하거든요

간단한 쉘 프로그래밍이라
파이프 , I/O redirection 정도만 하면 될것 같긴한데
좀 힘드네요..

codebank의 이미지

저는 주로 문자열 파싱을할때 strtok를 사용합니다.
하지만 명령라인에 들어오는 부분에 대한 파싱이라면 조금 변형을하면 되지않을까
싶은데요.
즉, 구분자인 ' ', '<', '>', '|', '='...등을 미리 token으로 정해놓고 그것이 발견되면
이전까지의 문자열을 받아들이는 알고리즘에 추가적으로 읽어온 문자열의 길이를
구하고 원본 문자열의 그 위치만큼 읽어온 문자열의 합만큼 이동을하게하면 원하는
구분자도 구할 수 있을겁니다.
저라면 C언어를 사용하서 위와같은 로직으로 작성했을것 같네요. :)

------------------------------
좋은 하루 되세요.

김정균의 이미지

strtok 보다는 strtok_r 이나 strsep 를 권장합니다.

man page 에서도 strtok 보다는 strtok_r 이나 strsep 를 쓰라고 권장합니다. (glibc man page 에는 그런데, 다른 데서는 어떤지 모르겠군요.)

sjang의 이미지

strtok는 쓰레드 safe 하지 않습니다.
strtok_r는 safe 하지요. 그래서 권장하지요.

The Future !!!

madkoala의 이미지

저같은 경우는 정형화된 문자열 파싱에는 대부분 PCRE를 사용합니다.
strtok_r도 가끔 사용하긴 하는데,
pcre가 더 편하더군요.

댓글 달기

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