scanset の解釈
が与えられた場合、は大文字ではないためhelloWORLD
、変換指定%[A-Z]
はすぐに失敗します。h
したがって、scanf()
何も変換できなかったことを示す 0 を返します。戻り値をテストした場合は、それがわかります。
それが与えられるHELLoworlD
と、scanset は に一致HELL
し、最初で停止しo
ます。フォーマット文字列もリテラルに一致させようとしますが、一致後に一致しなかったことを が報告するs
方法はありません。scanf()
HELL
バッファオーバーフロー
は、読み取られる文字数に制限がないため%[A-Z]
、一般に (そのままで) 危険であることに注意してください。%s
あなたが持っている場合:
char str[50];
次に、次を使用する必要があります。
if (scanf("%49[A-Z]", str) != 1)
...some problem in the scan...
str
また、宣言された長さとフォーマット文字列の数値の間には「1 の違い」があることに注意してください。これは厄介です。フォーマット文字列とは異なり、引数としてその数値を指定する方法はないためscanf()
( とは異なりprintf()
)、その場でフォーマット文字列を作成することになる場合があります。
int scan_upper(char *buffer, size_t buflen)
{
char format[16];
if (buflen < 2)
return EOF; // Or other error indication
snprintf(format, sizeof(format), "%%%zu[A-Z]", buflen-1); // Check this too!?
return scanf(format, buffer);
}