# 課題4-5の「値を捨てる」とは > 課題4-5でscanfが値を捨てるという操作がよくわからないです という質問が出たので,回答を共有します. ## 短くいうと 課題4-5の`scanf("%*s")`で値を捨てるという意味は,第二引数以降の引数に値を格納しないという意味です. ## scanfの返り値 スライド16ページ目の8行目の`r = scanf("%d", &x);`でscanfの返り値(rに代入された値)は,正常に読み取りができた引数のリストです. つまり,xのために%dで整数の読み取りに成功した場合は,rには1が入ります. 失敗した場合は,rには0が入ります. 例えば,プログラムを実行して`a`という入力をすると,8行目のscanfは失敗してxに値は格納されず,rには成功した数である0が入力されます.このとき,入力の`a`は入力された状態のまま(入力バッファにたまったまま)です. ## 値を捨てるとは そして,質問にあった12行目の`scanf("%*s")`で値を捨てているというのは,入力された状態になったままの文字列を全て読み取ってあげて,入力バッファにたまっている文字列をなくす,ということです *が値を引数に格納しないという意味で,sは文字列という意味です.ここで,入力バッファにたまっている文字列は全てscanfで読み取られます.読み取られた値は,*がついているためどの変数にも格納せずに捨てられます. ## 値を捨てなかったらどうなるの? もし,`scanf("%*s")` をせずに, ``` int x1, x2, r1, r2; r1 = scanf("%d", &x1); r2 = scanf("%d", &x2); ``` とし,`a`を入力した場合, 1回目scanfは失敗し,x1には何も格納されず,入力バッファに`a`が残ったままです. 2回目のscanfでは,次の入力を読み取ってくれるわけではなく,`a`から読み取ろうとして,2回目の入力を待たずに読み取りに失敗します. ここで, ``` int x1, x2, r1, r2; r1 = scanf("%d", &x1); scanf("%*s") r2 = scanf("%d", &x2); ``` といったように,途中で文字列を捨てる処理をすると,`a`を入力した場合,2回目の入力を待ち,2回目で数字を入れると読み取りは成功します. ## 参考 https://ja.wikipedia.org/wiki/Scanf https://www.tutorialspoint.com/c_standard_library/c_function_scanf.htm