C 言語でユーザ入力を取得する

胡金庫 2023年10月12日
  1. 関数 scanf を使って C 言語で与えられたフォーマットに従ったユーザ入力を取得する
  2. 与えられた書式に基づいてユーザ入力を解析する scanf を使用する
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'
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C IO