Member 13476370 Ответов: 3

Считывание пользовательского ввода в массив struct


программа предназначена для регистрации информации о членах в глобальном массиве member_array
проблема в том, что он предназначен для приема 9 входов от пользователя, но когда я его тестирую .. программа принимает только 6 из них, прежде чем она завершается .. Я не знаю почему!

Что я уже пробовал:

typedef struct
{
    int buildNum;//use validateNegative
    char street[10];
    char city[10];
} addressStruct;

typedef struct
{
    char name[10];
    char domain[10];

} emailStruct;

typedef struct
{
    char name[10];
    int ID;
    addressStruct address;
    int mobile;
    int age;
    emailStruct email;
    int booksBorrowed;
} member;
member member_array[50];
<pre>void registeration(void)
{

    gets(member_array[i].name);
    scanf("%d",&(member_array[i].ID));
    scanf("%d",&(member_array[i].address.buildNum));
    gets(member_array[i].address.city);
    gets(member_array[i].address.street);
    scanf("%d%d",&(member_array[i].mobile),&(member_array[i].age));
    gets(member_array[i].email.name);
    gets(member_array[i].email.domain);
    i++;
    return ;

}
int main()
{
  registeration();

  return 0;
}

3 Ответов

Рейтинг:
2

Jochen Arndt

Причина для чтения не все входные значения получены с помощью gets и scanf variantly.

получает - Справочник по c++ [^] считывает до тех пор, пока не будет прочитан символ новой строки без сохранения символа новой строки в буфере чтения.

ссылка на scanf - C++ [^] пропускает ведущие пробелы (включая символы новой строки) и читает до тех пор, пока формат больше не будет совпадать. Это обычно позволяет вводить новые символы строки во входной буфер системы.

Таким образом, после вызова будет непрочитанный символ новой строки scanf. При звонке gets aftwerwards, который будет считывать символ новой строки и останавливаться, приводя к пустой строке в переданном буфере.

Чтобы избежать таких проблем, не используйте обе функции и не пропускайте символы новой строки перед вызовом gets.

Общим решением является использование ссылка на fgets - C++ [^] для всех операций чтения (вместо gets как уже предлагалось). Для входных данных, которые не являются строками, используйте такие функции преобразования, как atoi, atof, или sscanf для нескольких параметров в одной строке.


Рейтинг:
1

OriginalGriff

Мы не можем сказать - это будет зависеть от того, что именно вы вводите в любое время, и мы не можем видеть, как вы печатаете!
Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей системы компилятора, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


Рейтинг:
1

CPallini

В вашем коде вам нужен глобальный код. int i и переменная тоже. Кроме того, вы должны инициализировать его следующим образом: 0.

Тем не менее, мои советы таковы::

  • Не используйте глобальные переменные, передавайте локальные переменные в качестве параметров своим функциям.
  • Не используйте устройство gets функция, использование fgets вместо