Как проверить длину входной строки в C - PullRequest
0 голосов
/ 28 мая 2018

У меня есть эта функция, которая проверяет, является ли строка такой:

void get_string(char *prompt, char *input, int length)
{
    printf("%s", prompt);                                   
    fgets(input, length, stdin);
    if (input[strlen(input) - 1] != '\n')
    {
        int dropped = 0;
        while (fgetc(stdin) != '\n')
        {
            dropped++;
        }
        if (dropped > 0)
        {
            printf("Errore: Inserisci correttamente la stringa.\n");
            get_string(prompt, input, length);
        }
    }else{
        input[strlen(input) - 1] = '\0';
    }
    return;
}

С этой функцией я могу повторить ввод, только если строка длиннее length.

Какя могу сделать, если я должен также проверить, если строка короче?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Код OP подвергается хакерской атаке и может вызывать неопределенное поведение .

// What happens if the first character read is a null character?
fgets(input, length, stdin);
if (input[strlen(input) - 1] != '\n')

Когда fgets() читает входные данные, входные данные нулевой символ не является специальным.Он читается и сохраняется как любой другой символ.

Если это патологический случай, input[0] == 0 и strlen(input) - 1 равны SIZE_MAX.input[SIZE_MAX], безусловно, является доступом за пределы массива, поэтому неопределенное поведение .


Проверка, если fgets() не прочитала всю строку, - установить последний символ буфера наненулевой и более поздний тест, если он становится 0.

assert(input && length > 1);

input[length - 1] = '\n';

// check `fgets()` return value
if (fgets(input, length, stdin) == NULL) {
  return NULL;
}

if (input[length - 1] == '\0' && input[length - 2] != '\n') {
  // more data to read.
0 голосов
/ 28 мая 2018

Если строка короче, fgets позаботится об этом.Буфер не будет заполнен, символ новой строки будет помещен в конец строки.

Просто проверьте, если strlen(input) < length после fgets.Если это условие оценивается как истинное, вы читаете меньше максимально возможного количества байтов из-за размера буфера.

...