読者です 読者をやめる 読者になる 読者になる

臥薪嘗胆

インフラエンジニアのあれこれ

Cやってみよう #2

昨日の続き

引数をとって何かを出力する

何作る・・・?

  • 無駄なやつ作る
  • ググッてビビッときたのが、素数checker

ひとまず、引数をとって出力するだけのやつを作ってみる

  • 引数は何個でもOK
  • int count; が無いとコンパイルエラーになった。丁寧。
chk-prime.c: 関数 ‘main’ 内:
chk-prime.c:16:10: エラー: ‘count’ が宣言されていません (この関数内での最初の使用)
     for (count = 1; count < argc; count++){
          ^
chk-prime.c:16:10: 備考: 未宣言の識別子は出現した各関数内で一回のみ報告されます

ひとまず引数をprintするだけの動くもの。

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

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

    for (count = 1; count < argc; count++){
        printf("argv[%d] = %s\n", count, argv[count]);
    }
}
  • argc ・・・ argcはargument countの略です。
  • printf を使って count を添字として配列から出力している

ふむふむ。
ここまではOK。

では引数が素数か否か判定するロジックを入れてみる

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

int main(int argc, char *argv[]) {
    int count;
    int divisor;
    int i;
    int x;

    for (count = 1; count < argc; count++){

        divisor = 0;              /* 約数のcount用 */
        x = atoi(argv[count]);    /* 引数を数値にキャストして変数に入れる */

        for (i = 1; i <= x; i++){ /* 引数(int:x)回分処理をする */
            if( x % i == 0 ){
                divisor++;        /* 割り切れた場合、約数をカウントアップ */
            }
        }

        if ( divisor == 2 ){      /* 1と引数自身で割り切れた場合、(2の時)素数 */
            printf("%s is prime\n", argv[count]);
            /*
        } else {
            printf("%s is not prime\n", argv[count]);
            */
        }
    }
}
gcc chk-prime.c -o chk-prime.o

できた

[vagrant@CentOS-71 ctest]$ for i in $(seq 1 100);do     ./chk-prime.o $i; done
2 is prime
3 is prime
5 is prime
7 is prime
11 is prime
13 is prime
17 is prime
19 is prime
23 is prime
29 is prime
31 is prime
37 is prime
41 is prime
43 is prime
47 is prime
53 is prime
59 is prime
61 is prime
67 is prime
71 is prime
73 is prime
79 is prime
83 is prime
89 is prime
97 is prime

よさそう