計算機科学のブログ

C - 小さなツールの作成 - 1つのことだけをうまくやる - コマンドライン引数, オプション

Head First C ―頭とからだで覚えるCの基本David Griffiths(著)、 Dawn Griffiths(著)、 中田 秀基(監修)、 木下 哲也(翻訳)、 O’Reilly Media)の 3章(小さなツールの作成 - 1つのことだけをうまくやる)、p.150(ピザの一切れ)の解答を求めてみる。

コード

order_pizza.c

#include <unistd.h>
#include <stdio.h>
#include <stdbool.h>

int main(int argc, char *argv[])
{
    char *delivery = "";
    int thick = 0;
    int count = 0;
    char ch;
    while ((ch = getopt(argc, argv, "d:t")) != EOF)
    {
        switch (ch)
        {
        case 'd':
            delivery = optarg;
            break;
        case 't':
            thick = true;
            break;
        default:
            fprintf(stderr, "Unknown option: '%s'\n", optarg);
            return 1;
        }
    }
    argc -= optind;
    argv += optind;
    if (thick)
    {
        puts("Thick crust.");
    }
    if (delivery[0])
    {
        printf("To be delivered %s.\n", delivery);
    }
    puts("Ingredients:");
    for (int count = 0; count < argc; count++)
    {
        puts(argv[count]);
    }
    return 0;
}

入出力結果(Terminal, Zsh)

% cc order_pizza.c -o order_pizza
% ./order_pizza                  
Ingredients:
% ./order_pizza -d
./order_pizza: option requires an argument -- d
Unknown option: '(null)'
% ./order_pizza -d del1 
To be delivered del1.
Ingredients:
% ./order_pizza -t     
Thick crust.
Ingredients:
% ./order_pizza ab cd
Ingredients:
ab
cd
% ./order_pizza -d del1 -t ab cd
Thick crust.
To be delivered del1.
Ingredients:
ab
cd
%