scanfはprintfの逆を行う関数で、文字列、数値の入力を行うことができます。下は入力された数値をそのまま表示するプログラムです。(注意:数値以外を入力するとバグります)
#include <stdio.h>
int main(){
int a;
scanf("%d",&a);
printf("%d\n",a);
return 0;
}
scanfは便利な関数ですが、扱いかたが難しく、危険な関数でもあります。数値型指定の場合に他の文字を入れるとバグったりするので、文字配列指定にしたり、文字のポインタ指定にしたりしますが、入力によってはオーバーフローの原因となりますので、注意が必要です。より簡単に、安全に入力を可能にする方法は、次に挙げる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でもっと詳しく扱います。