C言語学習メモ——scanf(%[^n]%c)
scanf およびフォーマット指定子
参考【scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s - cppreference.com】
理解する必要があるのは [%*[^\n]% c] ですが、これを2 つの部分 [% [^\n]] [%*c]に分割します。
各変換指定子の一致はパーセント記号 [%] で始まります。
% の後のアスタリスク [*] は [代入抑制文字] を意味し、scanf 関数の一致結果を受け入れるためにパラメータが必要ないことを意味します。
例えば:
#include <stdio.h>
int main(void)
{
int number = 0;
printf("input a number: ");
scanf("%d", &number);
printf("number is [%d]\n", number);
return 0;
}
ユーザーは数値を入力し、それを変数番号に割り当てる必要があります。
実行結果は次のとおりです。
%の後に*を付けて%*dにするとnumberには代入されません。
#include <stdio.h>
int main(void)
{
int number = 0;
printf("input a number: ");
scanf("%*d", &number); // add *
printf("number is [%d]\n", number);
return 0;
}
実行結果は次のとおりです。
ユーザーが入力した数値を変数数値に割り当てることができないことがわかります。[% c] は、文字の一致 (%c は一致文字) を意味しますが、変数への割り当ては意味しません。では、 [% [^\n]]とは何を意味するのでしょうか? \n は改行文字です。角括弧 [ ] は集合を表します。はい、高校数学の最初の授業では集合です。セットの最初の文字が ^ の場合、セットにない文字と一致します。(高校で習う補集合) 集合の内容は、[1-9]、[az] のような範囲にすることもできます。
#include <stdio.h>
int main(void)
{
char str[100];
printf("input a number: ");
scanf("%[a-zA-Z]", str);
printf("[%s]\n", str);
return 0;
}
実行結果は次のとおりです。
要約すると、[%*[^\n]] は改行文字より前のすべての文字と一致しますが、値は割り当てられません。
% の後に数字を追加して、一致する文字の数を示すこともできます。
#include <stdio.h>
int main(void)
{
char str[100];
printf("input a number: ");
scanf("%5[a-zA-Z]", str); // note 5
printf("[%s]\n", str);
return 0;
}
実行結果は次のとおりです。
5 文字のみ一致
%*[^\n] が文字と一致しない場合、次の %*c も一致しません。したがって、改行文字を吸収して、これら 2 つの文を分離する必要があります。
scanf("%*[^\n]");
scanf("%*c");
要約:
ワイルドカード文字% [^\n] は、改行文字までのすべての文字をスキップすることを意味します。
^for (i=0;i<2;i++) fscanf(fin,"% [^\n]% c"); 2 行スキップします。
%は「スキップ」
[^\n] を意味します。文字列の区切り文字は「\n」です。角かっこ
%*[^\n] 内に区切り文字テーブルを記述すると、\n より前のすべての文字列をスキップできます。
%*c は、行末を「スキップ」する改行文字です。
編集日: 2022 年 12 月 8 日