このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

scanf()とか

本編に書いた→ 教養としてのC言語プログラミング入門は成立するのか - 檜山正幸のキマイラ飼育記

僕は最初から「scanfは使うべきではない」と教わったので、scanfの存在は知っているが使ったことはない。正体がハッキリした文字列にsscanf()を使うことはあるけど。

だけど、教育現場ではscanf()を使っている(使わせている)みたい。色々な事情からしょうがないのかなぁ、、、、、

人生も終わりに近づいてscanf()を使う(使わせる)はめになるとは思わなんだ。


これは厄介者だ。

#include <stdio.h>

int main()
{
    int n1, n2;
    while (1) {
        printf("> ");
        scanf("%d%d", &n1, &n2);
        printf("n1 = %d, n2 = %d\n", n1, n2);
    }
    return 0;
}

チェックとフラッシュすれば、まーナントカ使えなくもない。

#include <stdio.h>

int main()
{
    int n1, n2;
    int k;
    while (1) {
        printf("> ");
        k = scanf("%d%d", &n1, &n2);
        if (k == 2) {
            printf("n1 = %d, n2 = %d\n", n1, n2);
        } else {
            fflush(stdin); // 残った入力データを捨てる
        }
    }
    return 0;
}

ある程度は信頼できる入力から、整数値の列を入力するなら、

#include <stdio.h>

int main()
{
    int n;
    int k;
    do {
        k = scanf("%d", &n);
        if (k == 1) {
            printf("%d\n", n);
        } else {
            printf("BAD INPUT\n", n);
            fflush(stdin);
        }
    }  while (k == 1);
    return 0;
}

コマンドライン引数

#include <stdio.h>

int main(int argc, char **argv)
{
    int n = 0;
    if (argc > 1) {
        n = atoi(argv[1]);
    }
    printf("%d\n", n);
    return 0;
}