Краткий ответ: вы не можете.
Использование scanf()
особенно опасно из-за этого, если вы хотите читать в строке (%s
);если пользователь вводит больше данных, чем может вместить ваш буфер, у вас на руках переполнение буфера.
fgets()
, с другой стороны, позволяет вам указать максимальное количество байтов, которые вы будете читать, что не позволит вамот переполнения буфера.
Вот краткий пример того, как вы бы написали функцию для некоторого ввода, которая проверила бы, что ввод был в пределах указанной длины и был полной линией (заканчивая \n
- эта процедура отбрасывает \n
с входа):
void getInput(char *question, char *inputBuffer, int bufferLength)
{
printf("%s (Max %d characters)\n", question, bufferLength - 1);
fgets(inputBuffer, bufferLength, stdin);
if (inputBuffer[strlen(inputBuffer) -1] != '\n')
{
int dropped = 0;
while (fgetc(stdin) != '\n')
dropped++;
if (dropped > 0) // if they input exactly (bufferLength - 1)
// characters, there's only the \n to chop off
{
printf("Woah there partner, your input was over the limit by %d characters, try again!\n", dropped );
getInput(question, inputBuffer, bufferLength);
}
}
else
{
inputBuffer[strlen(inputBuffer) -1] = '\0';
}
}
int main()
{
char firstAnswer[10];
getInput("Go ahead and enter some stuff:", firstAnswer, 10);
printf("Okay, I got: %s\n",firstAnswer);
}