급질요. C 에서 옵션 주기

phscom의 이미지

getopt()를 사용하여 옵션 처리를 하였을때

명령어가 a 이고 옵션을 추가 한다면
a -a

이런 식으로 처리 를 할수 있는데

가령
옵션을 이어서 주고 싶다고 할때
a -ab 또는 a -abc

이런식으로 처리하는 방법 없을까요?
몇일 고민해도 답을 얻지 못해서요.
고수님들 조언 부탁 드려요.

ㅡ,.ㅡ;;의 이미지

phscom wrote:
getopt()를 사용하여 옵션 처리를 하였을때

명령어가 a 이고 옵션을 추가 한다면
a -a

이런 식으로 처리 를 할수 있는데

a -a 를 처리하는곳에다가 a다음문자를 읽어보고 처리하시면 될듯..


----------------------------------------------------------------------------

최종호의 이미지

옵션을 이어서 처리하고 싶으시다는게

-ab 를 -a -b 로 인식하고 싶다는 것인지 옵션 이름을 "ab" 로 주고
싶으신 것인지 확실치가 않네요.

getopt() 에서는 전자는 기본으로 지원하는 사항이니 후자일 듯 한데,
'옵션을 이어서 처리하고" 싶으시다는 것을 봐서는 전자일지도 모르겠다는 생각이 듭니다.

후자의 경우는 직접 argc, argv 를 옮겨가며 코딩을 하셔도 되고,
GNU 환경이면 getopt_long() 이라는 것도 있는 듯 하고요,
AutoGen/AutoOpts 나 비슷한 코드생성 툴을 사용하셔도 될 듯 합니다.

youngminny의 이미지

최종호씨 말대로 기본은 전자의 경우입니다.
원하시는게 전자인 경우라면, 아마도 질문을 안하셨을것 같구요.
후자의 경우라면
getopt(argc, argv, "a:")
라고 해서
case 'a':
부분에서 optarg를 이용하여 문자열을 얻어오면 -ab라는 묶어진 Option을 구분해 낼 수 있을것 같습니다.
질문하신 예를 기준으로 보면,
a -abc
라고 하면 case 'a':
에서 optarg는 "bc"를 가르키게 되니까...
Program에서 Option "abc"가 들어왔구나 판단하실 수 있을것 같은데요..
질문 자체가 조금 모호해서 제 의견도 다소 모호하게 했네요.. ^^

alwaysN00b의 이미지

phscom wrote:
getopt()를 사용하여 옵션 처리를 하였을때

명령어가 a 이고 옵션을 추가 한다면
a -a

이런 식으로 처리 를 할수 있는데

가령
옵션을 이어서 주고 싶다고 할때
a -ab 또는 a -abc

이런식으로 처리하는 방법 없을까요?
몇일 고민해도 답을 얻지 못해서요.
고수님들 조언 부탁 드려요.

a -ab 이면
main에서 받는 argv[1] 이 -ab 이구요
- 이면 옵션처리 루틴만드시고

argv[1] 문자열을 다른 함수에 넘기던가 해서 길이 체크하시면 젤 쉬울것 같네요

if(argv[1][0] == '-'){
    j = strlen(argv[1])){
    /* 옵션 길이만큼 처리해주실면 될듯 */
    }
}

ps. ls -al 처럼 al 옵션 처리를 하는 경우 입니다.

언제나 시작

정태영의 이미지

alwaysN00b wrote:
phscom wrote:
getopt()를 사용하여 옵션 처리를 하였을때

명령어가 a 이고 옵션을 추가 한다면
a -a

이런 식으로 처리 를 할수 있는데

가령
옵션을 이어서 주고 싶다고 할때
a -ab 또는 a -abc

이런식으로 처리하는 방법 없을까요?
몇일 고민해도 답을 얻지 못해서요.
고수님들 조언 부탁 드려요.

a -ab 이면
main에서 받는 argv[1] 이 -ab 이구요
- 이면 옵션처리 루틴만드시고

argv[1] 문자열을 다른 함수에 넘기던가 해서 길이 체크하시면 젤 쉬울것 같네요

if(argv[1][0] == '-'){
    j = strlen(argv[1])){
    /* 옵션 길이만큼 처리해주실면 될듯 */
    }
}

ps. ls -al 처럼 al 옵션 처리를 하는 경우 입니다.

그런것들은 빈번하게 일어나기 때문에
getopt란 인터페이스가 존재합니다 :)

man 3 getopt

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

운형의 이미지

더 잘쓰시려면.. getopt_long 아.. 함수 이름이 헛갈리네.. getopt 찾아보시면.. 같이 나오는 건가.. 끝에 더보라고 하는데 나오나 하여간..

getopt의 확장형들이 있구요. 메뉴얼 페이지에 예제까지 있는 함수에요..

그만큼 한번에 이해 하기 힘들다는 이야기도 되구요.

Do you think that's the air you are breathing now?

ssehoony의 이미지

꼭 getopt 를 고집할 이유가 없다면

argp 를 사용하시는 것도 좋을 듯 합니다.
일단 이거 사용하면 phscom님께서 고민하시는건 간단히 해결됩니다.
argp 가 전 개인적으로 더 맘에 들더군요.

http://www.gnu.org/software/libc/manual/html_node/Argp.html#Argp

댓글 달기

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