第11章の4 コマンドライン引数

1. コマンドライン引数とは

実は main関数にも引数を渡すことができます。 この main関数に渡す引数のことを「コマンドライン引数」といいます。

2. main関数に引数を渡す方法

main関数へ渡せる引数は、

  • 引数の総個数
  • 引数の文字列を指すポインタの配列

の2つです。一般的に、

int main(int argc, char *argv[]) と記述し、

  • int argc: 引数の総個数(プログラム名も含む)
  • char *argv[]: 引数の文字列を指すポインタの配列を表します。

とりあえず、下の例を見てみましょう。

#include <stdio.h>

int main(int argc,char *argv[])
{
    int i;
    
    printf("引数の総個数 = %d\n", argc);
    for (i = 0; i < argc; i++) {
        printf("%d番目の引数 = %s\n", i, argv[i]);
    }

    return 0;
}

このプログラムの名称を「sample.c」とし、次の手順で実行するものとします。

  1. コンパイル、リンクして、「sample.exe」を作成する。
  2. 引数として「ABC DEF GHI」を指定することとし、
    sample ABC DEF GHI とコマンドラインから入力する。
  3. 実行結果を確認する。

【実行結果例】

※ 処理系によって実行結果が異なる場合があります。

これはつまり、main(int argc, char *argv[]) に次のように引数が渡ったことを表します。

〇 演習問題

問1

次のプログラムの空欄部を埋めて、プログラムを完成させなさい。

#include <stdio.h>
#include <stdlib.h>

int main(__________)
{
    int sum;
    
    if (________ != 3 ) {                     // 引数の個数をチェック
        puts("引数の個数が違います");
        return 0;                             // エラーなら処理を打ち切り
    }
    sum = atoi(_________) + atoi(_________);  // 文字列を数値にして合計をとる
    printf("合計 = %d\n", sum);
    
    return 0;
}

【実行結果例】(引数:21 42のとき)

問2

プログラム起動時に入力された複数個の文字列の文字数(’\0’は除く)を数えて、例のように文字列とともに表示するプログラムを作成しなさい。

なお、プログラムは次の2つの関数を含まなければならない。
1. 文字数を数える関数:1つの文字列のアドレスを受け取り、その文字列の文字数を返す。
2. 文字列を表示する関数:1つの文字列のアドレスと文字数を受け取り、これを表示する。

【実行結果例】

解答例

// 問1
#include <stdio.h>
#include <stdlib.h>    // atoi関数を使用するためにインクルード

int main(int argc, char *argv[])
{
    int sum;
    
    if (argc != 3 ) {                     // 引数の個数をチェック
        puts("引数の個数が違います");
        return 0;                         // エラーなら処理を打ち切り
    }
    sum = atoi(argv[1]) + atoi(argv[2]);  // 文字列を数値にして合計をとる
    printf("合計 = %d\n", sum);
    
    return 0;
}
  • コマンドライン引数として受け取るのは文字列リテラルのアドレスです。そのため、数値として利用する場合は、標準ライブラリ関数の atoi や atofを用いて変換する必要があります。
  • また、引数の個数が不足している場合に直接変換を試みると、未定義動作によりプログラムがクラッシュする可能性があるため、必ず argc の値を確認してください。
// 例2
#include <stdio.h>

int get_n(char *pa);
void print_data(char *pa, int n);

int main(int argc, char *argv[])
{
    int n;

    for (int i = 1;i < argc; i++) {
        n = get_n(argv[i]);
        print_data(argv[i], n);
    }

    return 0;
}

/***
文字数を数える関数
引数:char *pa;    文字列を指すポインタ
返却値:文字数
***/
int get_n(char *pa)
{
    int count = 0;
    
    while(*pa != '\0'){
        count++;
        pa++;
    }
    
    return count;
}

/***
文字列を表示する関数
引数:char *pa;    文字列を指すポインタ
      int n;       文字数
返却値:なし
***/
void print_data(char *pa, int n)
{
    printf( "\"%s\" は %d 文字です。\n", pa, n);
}

コメント