scanf関数 - スキャン集合
当ページのリンクには広告が含まれています。
前回の「scanf関数を使った文字列入力の注意点 - ホワイトスペース」では、scanf関数の変換子「%s」を使うと「ホワイトスペースを含む文字列」を適切に変数へ格納できないことを紹介しました。
scanf関数の「スキャン集合」を使えば、「ホワイトスペースを含む文字列」を変数へ格納することができるので、ここではまず「スキャン集合」の概念と使い方をみていきます。
スキャン集合とは
スキャン集合とは
scanf関数で、読み込む文字を指定する方法のことをいいます。
例えば、次のように指定すると
scanf("%[xyz]", moji);
変数「moji」に「x」「y」「z」という文字のみを格納し(読み込み)、それ以外の文字を入力すると文字入力を終了するということになります。
サンプルプログラム
次のサンプルプログラムを実行してみましょう。
#include <stdio.h> int main(void) { /* 変数の定義 */ char moji[1000]; /* 文字列の入力 */ printf("文字列を入力してください。\n"); scanf("%[xyz]", moji); /* 文字列の出力 */ printf("%s\n", moji); return 0; }
実行結果
いくつかの実行結果です。
文字列を入力してください。 xyza xyz
文字列を入力してください。 xxxzzzyyy3 xxxzzzyyy
「x」「y」「z」のいずれかの文字が入力されていると文字の入力が続き、それ以外の文字が入力されると文字入力が終了することがわかります。また、変数には「x」「y」「z」のみが格納されています。
スキャン集合の応用 - 範囲指定
スキャン集合では、読み込みたい文字の範囲指定をすることもできます。
例えば、次のように指定すると
scanf("%[a-z]", moji);
アルファベットの小文字「a」から「z」までの文字を変数に格納する(読み込む)、それ以外の文字を入力すると文字入力を終了するということになります。
サンプルプログラム
次のサンプルプログラムを実行してみましょう。
#include <stdio.h> int main(void) { /* 変数の定義 */ char moji[1000]; /* 文字列の入力 */ printf("文字列を入力してください。\n"); scanf("%[xyz]", moji); /* 文字列の出力 */ printf("%s\n", moji); return 0; }
実行結果
いくつかの実行結果です。
文字列を入力してください。 abcde5 abcde
文字列を入力してください。 rtyhsgA rtyhsg
アルファベットの小文字「a」から「z」のいずれかの文字が入力されていると文字の入力が続き、それ以外の文字が入力されると文字入力が終了することがわかります。また、変数にはアルファベットの小文字「a」から「z」のみが格納されています。
スキャン集合の応用 - 否定
スキャン集合で、「読み込みたい文字の指定」と「読み込みたい文字の範囲指定」する機能をみてきました。他にも読み込みたくない文字を指定する否定の機能もあります。
例えば、次のように指定すると
scanf("%[^x]", moji);
「x」という文字以外のすべての文字を変数に格納する(読み込む)という意味になります。
サンプルプログラム
次のサンプルプログラムを実行してみましょう。
#include <stdio.h> int main(void) { /* 変数の定義 */ char moji[1000]; /* 文字列の入力 */ printf("文字列を入力してください。\n"); scanf("%[^xy]", moji); /* 文字列の出力 */ printf("%s\n", moji); return 0; }
実行結果
いくつかの実行結果です。
文字列を入力してください。 abcx abc
文字列を入力してください。 1234y 1234
「x」「y」以外の文字が入力されていると文字の入力が続き、「x」あるいは「y」が入力されると文字入力が終了することがわかります。また、変数には「x」「y」を除く文字が格納されています。
次は「scanf関数 - スキャン集合を使った文字列 - ホワイトスペース」についてみていきます。