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でもっと詳しく扱います。