掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26967

コマンドライン オプションチェック
投稿者---メロンパンナ(2006/05/23 20:36:10)


プログラム超初心者です。
読み込んだファイルを標準出力するプログラムを作っています。
HEX DUMPとかいうやつです。

コマンドラインよりオプションを受け取ります。
オプションの1つは-a10もしくは-a16で、10進表記か16進表記かを区別します。
2つ目はファイルのどこから出力するかで-u10や-u1Fなど、-uに続いている
数値により判別します。
3つ目は何バイトずつ表示するかで-s1,-s2,-s4のどれかです。

-a10の場合は-u以降の文字列を10進の数値として、-a16の場合は16進の数値
として変換しなくてはなりません。

オプションの指定がない場合はデフォルトでファイルの先頭から10進表記する
ことになっています。
オプションの指定は順不同です。
-u以降の文字列を数値に直すのに一番シンプルな方法はどんな感じでしょうか。

私が考えているのはまず-a16の指定があるかチェックして、
その後-sで始まる引数があるかチェックして、あったら-sを消してその後
strtolを使って。。。
といった感じです。
もっとシンプルにできないでしょうか。





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:コマンドライン オプションチェック 26969 Hermit 2006/05/23 22:46:07
<子記事> Re:コマンドライン オプションチェック 26971 かずま 2006/05/24 02:05:11


No.26969

Re:コマンドライン オプションチェック
投稿者---Hermit(2006/05/23 22:46:07)


GNU の getopt を使うってのはどうでしょう?


この投稿にコメントする

削除パスワード

No.26981

Re:コマンドライン オプションチェック
投稿者---メロンパンナ(2006/05/24 20:08:23)


>GNU の getopt を使うってのはどうでしょう?

ご回答ありがとうございます。

GNU・・・
今はまだ研修中で基礎の参考書に載ってる関数くらいしか使えません。
使ったら人の手を借りたことがバレバレなので。。。



この投稿にコメントする

削除パスワード

No.26982

Re:コマンドライン オプションチェック
投稿者---Hermit(2006/05/24 20:56:28)


>今はまだ研修中で基礎の参考書に載ってる関数くらいしか使えません。
>使ったら人の手を借りたことがバレバレなので。。。

一応ここの掲示板は、
「課題の丸投げはしません。」
って書いてあるので、
いけない気はするんだけど・・・

まあ、俺はどちらでもいいのでかまいませんが、
ここは、気にする人が多そうなので
地雷踏まないように気をつけましょうね。

(私は、わざと踏むのも面白いとは思っていますが(^^;)


この投稿にコメントする

削除パスワード

No.26983

Re:コマンドライン オプションチェック
投稿者---メロンパンナ(2006/05/24 23:44:48)


>一応ここの掲示板は、
>「課題の丸投げはしません。」
>って書いてあるので、
>いけない気はするんだけど・・・
>
>まあ、俺はどちらでもいいのでかまいませんが、
>ここは、気にする人が多そうなので
>地雷踏まないように気をつけましょうね。

課題の丸投げってそういう事ですか。。。
アドバイスありがとうございます。

課題はその引数に基づいてファイルを読み込んで16進表記するのですが
%xを使って表示してはいけないのです。
16進表記に見えるよう文字で出力するのです。
そして20〜7E以外のものはピリオドを表示するんです。
実はオプションがもうひとつあって、何バイトずつ区切って表示するかも
わけなくてはなりません。
フローチャートが書けなくては穴の多いプログラムにって言うのもわかりますが
5行くらいのプログラムすら実際にコンパイルかけて実行したことないので
こうしたらこんなエラーがでた!
みたいな事を実験的にできないしそういう実感もないので
非常にやりにくいです。
あぁ、こんなところで愚痴ってしまった。
すみません。




この投稿にコメントする

削除パスワード

No.26971

Re:コマンドライン オプションチェック
投稿者---かずま(2006/05/24 02:05:11)


シンプルとは言えませんが、
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void error(const char *msg) { fprintf(stderr, "%s\n", msg); exit(1); }

int main(int argc, char *argv[])
{
    int i, a = 0, s = 0, u = 0;  char *p, *v = NULL;

    for (i = 1; i < argc; i++) {
        if (argv[i][0] != '-') break;
        switch (argv[i][1]) {
        case 'a':
            if (a) error("-a duplicated");
            if (!strcmp(argv[i]+2, "10")) a = 10;
            else if (!strcmp(argv[i]+2, "16")) a = 16;
            else error("must be -a10 or -a16");
            break;
        case 'u':
            if (v) error("-u duplicated");
            v = argv[i] + 2;
            break;
        case 's':
            if (s) error("-s duplicated");
            if (!strcmp(argv[i]+2, "1")) s = 1;
            else if (!strcmp(argv[i]+2, "2")) s = 2;
            else if (!strcmp(argv[i]+2, "4")) s = 4;
            else error("must be -s1, -s2 or -s4");
            break;
        default:
            error("unkonwn option");
        }
    }
    if (a == 0) a = 10;
    if (s == 0) s = 1;
    if (v) {
        u = strtoul(v, &p, a);
        if (p == v || *p) error("invalid -u option");
    }

    printf("a=%d, s=%d, u=%d\n", a, s, u);
    return 0;        
}



この投稿にコメントする

削除パスワード

No.26980

Re:コマンドライン オプションチェック
投稿者---メロンパンナ(2006/05/24 20:05:56)


>シンプルとは言えませんが、

丸々ソースコードを書いていただいてありがとうございます。
C言語の基礎の教材のみ、実際にコードを打ったことのない状態で
今はフローチャートを書いてる状態です。
動作するか確認したこともないのですが、
ちゃんとアルゴリズムを示せと言われ、なかなか苦戦してました。
しっかり参考にさせていただきます。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧