Page 11 入力 --- プログラム処理中に入力を促す

scanf

scanfはprintfの逆を行う関数で、文字列、数値の入力を行うことができます。下は入力された数値をそのまま表示するプログラムです。(注意:数値以外を入力するとバグります)

#include <stdio.h>

int main(){
        int a;
        scanf("%d",&a);
        printf("%d\n",a);
        return 0;
}

scanfは便利な関数ですが、扱いかたが難しく、危険な関数でもあります。数値型指定の場合に他の文字を入れるとバグったりするので、文字配列指定にしたり、文字のポインタ指定にしたりしますが、入力によってはオーバーフローの原因となりますので、注意が必要です。より簡単に、安全に入力を可能にする方法は、次に挙げるfgetsを使用する方法です。

fgets

fgetsは文字列をファイルから読み込む関数ですが、コマンドラインからの入力もでき、文字列を数値に変換する関数も存在するので、fgetsをscanfの代わりに使用することができます。fgetsとscanfの違いは入力サイズを制御できる点にあります。そのため、オーバーフローを回避することができるのです。

char* fgets(char* 入力先変数, size_t サイズ, FILE* ファイル)

コマンドラインからの入力の場合は「ファイル」を「stdin」とします。

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

int main(){
        char c[10];
        printf("What's your name? ");
        fgets(c, sizeof(c), stdin);
        /* 注意:fgetsすると、最後に改行コードがついてしまうので、取り除く */
        /* strlen: 文字列の長さ取得。string.hのインクルードが必要 */
        c[strlen(c) - 1] = '\0'
        /* 表示 */
        printf("Hello %s.\n",c);
        return 0;
}

文字列の入力の場合はこれでOKですが、数字の入力の場合は次のように文字列を数字に変換します。

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

int main(){
        char c[10];
        int a;
        fgets(c, sizeof(c), stdin);
        a = atoi(c);
        printf("%d\n",a);
        return 0;
}

atoiは文字列を数値に変える関数です。類似の関数に、atol、atofがあります。

int atoi(char* 文字列)
long atol(char* 文字列)
double atof(char* 文字列)

文字列に関してはpage12でもっと詳しく扱います。

戻る