Керниган и Пайк обсуждают эту проблему в своей (превосходной) книге ' Практика программирования ' и пришли к выводу, что наиболее надежный и портативный способ сделать это - использовать sprintf()
для генерации строки формата .
Что вы можете сделать, это определить макрос как длину, исключая нулевой терминал, а затем использовать его следующим образом:
#define STR_EVALUATE(x) #x
#define STRINGIFY(x) STR_EVALUATE(x)
#define MAX_ARG_LEN 15
char arg[MAX_ARG_LEN+1] = "";
if (sscanf(arg, "%" STRINGIFY(MAX_ARG_LEN) "X", &input) > 0)
...
Или вы можете определить MAX_ARG_STRLEN как 15 и MAX_ARG_LEN как MAX_ARG_STRLEN + 1 и работать соответственно.