2

必要に応じて %*c を scanf() で使用してバッファをクリアすることに危険はありますか。

例えば:

char c;
for (int i = 0; i < 5; i++) {
  scanf("%c%*c", &c);
}

または

char* str;
char c;
int i;
scanf("%s", str);
scanf("%d%*c", &i);
scanf("%c%*c", &c);

バッファ オーバーフローやその他のセキュリティ上の問題を懸念する必要がありますか? このように C に対して scanf でアスタリスクを使用することに関する正式なドキュメントはないようです ( EDIT This is not true) ため、入力された余分な文字がどうなるかを正確に把握するのに苦労しています。Cでscanfバッファをクリアするより良い方法はありますか?

4

3 に答える 3

4

達成しようとしているタスクを「ユーザーが気にしたことの後に入力した可能性のあるジャンクをどのように読み取って破棄するか」として概念化すると、次のような構成になります。

int c;
while ((c = getchar()) != EOF && c != '\n') ;  /* discard till end of line or EOF */

しかしまた、そもそも使用しないことで問題全体を回避することができますscanf。これは、他のいくつかの理由から良い考えです。行全体をgetline、持っている場合、または持ってfgetsいない場合は、を使用して読み取り、手動で解析します。

于 2012-12-01T04:02:37.717 に答える
-1

scanfバッファーはありませんが、「入力」バッファーがあります。そして、それをクリアする最良の方法は、を使用することrewind(stdin)です。ただし、入力がリダイレクトされている場合、このアプローチには問題があります。

于 2012-12-01T04:02:50.293 に答える
-1

scanfバッファをクリアしたい場合は、こちら

char c;
for(int i = 0; i < 5; i++) {
    scanf("%c", &c);
    while(getchar() != '\n')
        continue;
}

または

char c;
for(int i = 0; i < 5; i++) {
    scanf("%c", &c);
    fflush(stdin);
}

しかし、あなたのコードは危険です...

于 2012-12-01T03:45:41.243 に答える