Обычно вы используете что-то вроде "%4c"
или "%4s"
для чтения максимум 4 символов (разница в том, что "%4c"
читает следующие 4 символа независимо, в то время как "%4s"
пропускает начальный пробел и останавливается на пробел, если он есть).
Однако, чтобы указать длину во время выполнения, вы должны стать немного хитрее, поскольку вы не можете использовать строковый литерал с «4», встроенным в него. Одна альтернатива - использовать sprintf
для создания строки, которую вы передадите scanf
:
char buffer[128];
sprintf(buffer, "%%%dc", max_length);
scanf(buffer, your_string);
Возможно, мне следует добавить: с помощью printf
вы можете динамически указать ширину или точность поля, поставив звездочку (*
) в строке формата и передав переменную в соответствующую позицию, чтобы указать ширину / точность:
int width = 10;
int precision = 7;
double value = 12.345678910;
printf("%*.*f", width, precision, value);
Учитывая, что строки формата printf
и scanf
очень похожи, можно подумать, что то же самое будет работать с scanf
. К сожалению, это не так - с scanf
звездочка в спецификации преобразования указывает значение, которое должно быть отсканировано, но не преобразовано. То есть что-то, что должно присутствовать во входных данных, но его значение не будет помещено ни в одну переменную.