Ограничение длины типа пользователя на C - PullRequest
2 голосов
/ 20 сентября 2019

Мой код запрашивает 10-значное число, он читает его в виде строки, передает его другой функции, которая проверяет, является ли ввод пользователя действительным числом и не содержит символов или символов с ASCII, а затем, если это хорошо, сatof изменяет строку в число для переменной.

Я хочу, чтобы пользователь вводил только 10 цифр / символов на консоли ввода, я имею в виду, если пользователь, например, введет 11 символов,консоль просто не захватывает его, или в случае, если это невозможно для C, сделайте так, чтобы, если пользователь вводил более 12 символов на входе, то программа запускает сообщение об ошибке, говорящее, что оно превышает предел, проблема в том,когда я пытался использовать этот метод, например, если я поставил несколько больших чисел, например, 40-значное число, то программа сходила с ума и отправляла просто непонятные результаты, такие как «1. # J», или если я помещал символ в серединечисла, затем он отправляет соответствующее сообщение об ошибке, которое я установил для пользователя, чтобы не вводить символы, но он все еще захватывает часть числа аи примите это, так как в этом нет ничего плохого, вот код main, который я пробовал:

int main() {

    char chain[10];
    float N;
    int valid=0;

    do{
        printf("introduce real numbers: ");
        fgets(chain, sizeof(chain), stdin);
        if( chain[strlen(chain)-1] == '\n')
            chain[strlen(chain)-1] = '\0';
        valid=validate_numbers(chain);  
    }while(valid==0);

    N=atof(chain);

    printf("float number is: %.2f", N);

    getche();

    return 0;
}

Вот остаток кода для более полной проверки: Pastebin

И извините, если есть какие-то ошибки новичка или вопрос прост - я довольно новое программирование.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Измените это:

char chain[10];

на это:

char chain[11]; // +1 for the NULL terminator

, поскольку C-строки должны быть завершены до NULL, поэтому нам нужна одна ячейка, зарезервированная для NULL-терминатора в нашем массиве(который будет хранить нашу строку).


Я имею в виду, если пользователь, например, введет 11 символов, консоль просто не захватит ее

Не возможно в C.

или в случае, если это невозможно для C, сделайте так, что если пользователь вводит более 12 символов на входе, то программа запускаетсообщение об ошибке, говорящее о превышении лимита.

Да, давайте сделаем это!Прочитайте строку и, если ее длина превышает 10 символов, выведите сообщение об ошибке.

Разрешите массиву chain иметь размер 12 (10 для максимальной длины допустимого ввода, 1для дополнительного символа (если есть) и 1 для NULL-терминатора), чтобы мы могли сохранить дополнительный символ, если таковой имеется.

Пример:

#include <stdio.h>
#include <string.h>
int main(void)
{
  char chain[12];
  printf("introduce real numbers:\n");
  fgets(chain, sizeof(chain), stdin);
  if( chain[strlen(chain)-1] == '\n')
    chain[strlen(chain)-1] = '\0';

  if(strlen(chain) > 10)
  {
    printf("Error: Maximum length of chain is 10! Exiting..\n");
    return 1;
  }

  return 0;
}

Примечание.используйте EXIT_SUCCESS и EXIT_FAILURE вместо простых чисел (1 и 0 соответственно): Должен ли я вернуть 0 или 1 для успешной функции?


Не имеет отношения к вопросу OP:Однако в полной версии вашего кода есть множество проблем, таких как эта верхняя строка кода int valid=validate_numbers(char number[]);, которая желает объявить метод.Это должно быть просто validate_numbers(char number[]);.То же самое относится и к определению метода.Убедитесь, что вы снова просмотрели весь свой код и прочитали сообщения, которые компилятор подарил вам.:)

0 голосов
/ 20 сентября 2019

А как насчет использования scanf вместо fgets?Это должно прочитать 9 символов и сохранить их как строку:

scanf("%9s" , &chain)

Я бы посоветовал прочитать https://en.m.wikipedia.org/wiki/Scanf_format_string, а также справочные страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...