Когда длина входных данных превышает размер массива строк C, каковы варианты решения этой проблемы? - PullRequest
1 голос
/ 25 октября 2019

С языком программирования C,

Я пытаюсь прочитать и сохранить строку ввода в массив символов, который имеет фиксированный размер [11].

Когда я набираю символы больше 10остальные символы отправляются на следующее сканирование.

Итак, мой вопрос:

  1. Можно ли каким-либо образом ограничить размер вводимого текста?

  2. Или, есть ли способ обрезать оставшиеся символы, когда ввод превышает размер массива символов, не отправляя на следующее сканирование?

  3. Или я должен просто знать, сколько символов нужно набрать?

  4. Или я должен создать условия для предотвращения этой проблемы?

int main(void)
{
    char phoneNum[11];
    char password[11];

    printf("Enter the phone Number: ");
    scanf("%10s", phoneNum);

    printf("Enter the password: ");
    scanf(" %10s", password);

    printf("\n\n");
    //Display
    printf("Phone number: %s\n", phoneNum);
    printf("Password : %s\n", password);

    return 0;
}

/*
What I tried: 
-input: 
 Enter the phone Number: 123-456-7890
 Enter the password:    // This part has been skipped.

-output:
 Phone number: 123-456-78
 Password: 90


What I expected:
-input:
 Enter the phone Number: 123-456-7890
 Enter the password: asdf12386945648

-output:
 Phone number: 123-456-78
 Password: asdf123869
*/

1 Ответ

2 голосов
/ 26 октября 2019

Можно ли каким-либо образом ограничить размер вводимого текста?

Нет, код не может помешать пользователю печатать. Вместо этого код может ограничить объем сохраненного ввода и потенциально потреблять или выходить из него с слишком большим количеством ввода.

Или есть ли способ обрезать оставшиеся символы, когда ввод превышает размермассив символов, не отправляемый на следующий scanf?

Да. Хорошо, чтобы не отправлять его на следующую функцию ввода. Разберитесь со своими проблемами здесь. Простое решение:

int read_input(char *destination, size_t sz) {
  if (sz > INT_MAX) sz = INT_MAX;
  if (fgets(destination, sz, stdin) == NULL) return EOF;
  size_t len = strlen(destination);
  if (len > 0 && destination[len-1] == '\n') { // lop off potential \n
    destination[--len]  = '\0';
  }
  if (len + 1 == sz) {  // if more input ...
    // let us consume it and toss it.
    int ch;
    while ((ch = fgetc(stdin)) != '\n' || ch != EOF) {
      ;
    }
    // Input exceeds expectations, take evasive action.
    // Maybe print an error message and try again?
    // For now, let us just exit.
    fprintf("Input too long\n");
    exit(EXIT_FAILURE);
  }
  return (int) len;
}    

Или я должен просто знать, сколько символов набирать?

Пользовательский ввод - зло - ожидайте худшего. Рекомендую разрешить в 2 раза максимально допустимый ввод. Помимо этого, происходит что-то плохое.

Или я должен создать условия для предотвращения этой проблемы?

Не может предотвратить, справиться только с ошибочным или гнусным вводом.


Совет: будьте щедры в ожидаемом размере ввода. 11 слишком мало для phoneNum[]. Разрешить вводу обрабатывать в 2 раза больше ожидаемого, скажем, 30 , , а затем квалифицировать ввод. Безумные входные длины являются атакой.

...