Как проверить длину пользовательского ввода в C? - PullRequest
2 голосов
/ 24 октября 2011

Я новичок в C, и чтение ввода меня действительно смущает.Я пытаюсь инициализировать массив размера 4, но иногда пользователь вводит допустимый ввод 3. В Java я мог бы проверить длину ввода и добавить условные выражения, но я не уверен, как это работает в C.

main(void){
        char str[N];
        int i;

        for(i = 0; i < N; i++){
                scanf("%c", &str[i]);
        }

        for(i = 0; i < N; i++){
            printf("%c\n", str[i]);
        }
}

Прямо сейчас, если я введу 4 или больше, все работает нормально.Если я введу 3, он сломается.Я бы хотел, чтобы он обрабатывал 3 или 4 символа.

На самом деле, корень проблемы заключается в следующем: я пытаюсь найти способ чтения на C в течение 24 часов и добавить его в 24 часа.Должен ли я подходить к этому совершенно по-другому?

Спасибо,

Ответы [ 2 ]

4 голосов
/ 24 октября 2011

scanf() позволяет использовать спецификаторы максимальной ширины:

То есть scanf("%3s", buffer) читает не более 3 символов + 1 NUL-терминатор.

4 голосов
/ 24 октября 2011

Краткий ответ: вы не можете.

Использование 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);

}
...