Kernighan と Pike は、彼らの著書The Practice of Programming (読む価値があります) でこの問題について議論しており、関数ファミリにsnprintf()
渡すための正しいバッファー サイズで文字列を作成するために を使用して解決しています。scanf()
実際には:
int scanner(const char *data, char *buffer, size_t buflen)
{
char format[32];
if (buflen == 0)
return 0;
snprintf(format, sizeof(format), "%%%ds", (int)(buflen-1));
return sscanf(data, format, buffer);
}
これにより、入力が「バッファ」として提供されるサイズに制限されることに注意してください。さらにスペースが必要な場合は、メモリ割り当てを行うか、メモリ割り当てを行う非標準のライブラリ関数を使用する必要があります。
scanf()
関数ファミリーの POSIX 2008 (2013) バージョンは、m
文字列入力 ( %s
、%c
、%[
) のフォーマット修飾子 (割り当て割り当て文字) をサポートしていることに注意してください。引数を取る代わりに、char *
引数を取り、char **
読み取る値に必要なスペースを割り当てます。
char *buffer = 0;
if (sscanf(data, "%ms", &buffer) == 1)
{
printf("String is: <<%s>>\n", buffer);
free(buffer);
}
sscanf()
関数がすべての変換仕様を満たさない場合、-like 変換用に割り当てられたすべてのメモリは%ms
、関数が戻る前に解放されます。