C 言語でユーザ入力を取得する
この記事では、C 言語でユーザ入力を取得する方法について複数の方法を紹介します。
関数 scanf
を使って C 言語で与えられたフォーマットに従ったユーザ入力を取得する
関数 scanf
はユーザの入力をフォーマットされたテキストとして処理し、変換された文字列の値をポインタに格納します。この関数のプロトタイプは printf
系の関数に似ています。この関数は、入力文字をどのように処理するかを指示するための文字列フォーマット引数と、対応する値を格納するための可変数のポインタ引数を受け取ります。
なお、%[^\n]
指定子は scanf
に最初の改行文字より前のすべての文字を 1つの文字列として処理し、それを char*
バッファに格納するよう指示します。保存先のバッファは、ユーザの入力文字列に十分な大きさでなければなりません。また、文字列変換指定子にオプションの文字 m
を指定すると、入力文字列を格納するのに十分なサイズのバッファを強制的に確保することができます。したがって、ユーザは与えられたポインタが不要になった後に free
関数を呼び出す必要があります。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char str1[1000];
printf("Input the text: ");
scanf("%[^\n]", str1); // takes everything before '\n'
printf("'%s'\n", str1);
exit(EXIT_SUCCESS);
}
出力:
Input the text: temp string to be processed
'temp string to be processed'
別の方法として、scanf
を使用して、フォーマット文字列指定子を変更することで、指定された文字よりも前に入力されたテキストを処理することもできます。次の例は、値 9
の最初の文字が見つかるまでユーザの入力をスキャンする scanf
呼び出しを示しています。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char str1[1000];
printf("Input the text: ");
scanf(" %[^9]*", str1); // takes everything before '9' in string
printf("'%s'\n", str1);
exit(EXIT_SUCCESS);
}
出力:
Input the text: temporary string 32j2 923mlk
'temporary string 32j2 '
与えられた書式に基づいてユーザ入力を解析する scanf
を使用する
scanf
関数のもう一つの便利な機能は、与えられたフォーマットに基づいてユーザ入力を解析することです。フォーマット文字列の中で *
文字が使われており、変換指定子に従うことで一致する文字を破棄することができます。次のコードサンプルでは、scanf
が必須の :
記号からなるテキスト入力を解析し、指定された記号の後の文字のみを行末まで保存する場合を示します。このオプションは、特定の文字がデリミタの位置に存在する固定フォーマットのテキストをスキャンするのに便利です。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char str1[1000];
printf("Input the text: ");
scanf("%*[^:]%*c%[^\n]", str1);
printf("'%s'\n", str1);
exit(EXIT_SUCCESS);
}
出力:
Input the text: temporary value of var3: 324 gel
' 324 gel'