Как получить ввод от пользователя в виде массива целых чисел в C?

Я новичок в C, в настоящее время изучаю его на курсе CS50 на edx.org (эта задача НЕ из курса CS50).

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

Теперь я получаю значения от пользователя таким образом (GetInt() и GetString() - это функции из заголовка и библиотеки cs50.h).

// Ask user for his name, and date of birth

printf("Enter your name: ");
char* name = GetString();

printf("Enter your day of birth: ");
int birth_day = GetInt();

printf("Enter your month of birth: ");
int birth_month = GetInt();

printf("Enter your year of birth: ");
int birth_year = GetInt();

Но я не хочу просить пользователя 3 раза получить дату, которую он может ввести одной строкой - например, 18.06.1985.

Итак, вопрос в том, как получить ввод от пользователя в формате DD.MM.YYYY, а затем сохранить его в массиве целых чисел, как [0, 1, 2], чтобы позже я мог получить доступ к этим значениям отдельно?


person Nikita K.    schedule 06.02.2016    source источник
comment
Вы можете использовать строку, чтобы получить ввод, а затем разметить его и сохранить значение в целочисленных переменных.   -  person ameyCU    schedule 06.02.2016
comment
Спасибо, а как это сделать? Есть ли более прямой способ использования scanf или что-то в этом роде?   -  person Nikita K.    schedule 06.02.2016


Ответы (2)


Создайте структуру, чтобы получить это:

typedef struct {
    int day;
    int month;
    int year;
} birthDay;

Когда вы собираетесь спросить пользователя, вы можете сделать:

int day, month, year;
printf("Type your birthday (day month year): ");
scanf("%d %d %d", &day, &month, &year);

Теперь вы можете правильно настроить свою структуру.

birthday bday;
bday.day = day;
bday.month = month;
bday.year = year;
person Paulo    schedule 06.02.2016
comment
Спасибо, это помогает! Я просто не знал, как правильно использовать scanf() - person Nikita K.; 06.02.2016
comment
Обратите внимание, что вы должны проверить возвращаемое значение scanf: если пользователь ввел правильный ввод, 3 числа, необязательно разделенные пробелом, возвращаемое значение будет 3, в противном случае некоторые из переменных day, month, year` могут быть не установлены вообще. - person chqrlie; 06.02.2016

Вы можете сделать следующее:

int array[3];
scanf("%d.%d.%d", &array[0], &array[1], &array[2]);

На входе 18.06.1990 массив [0] будет содержать 18, массив [1] будет содержать 6, а массив [2] будет содержать 1990.

person KKishore    schedule 06.02.2016
comment
Спасибо, это тоже правильно, но если это работает, мне даже массив не нужен! - person Nikita K.; 06.02.2016
comment
Не забудьте проверить, что scanf() вернул 3 перед использованием значений. (@NikitaK. — вы правы в том, что вам не обязательно использовать массив, вы можете использовать любые три различные переменные.) Жизнь становится интереснее, если вы хотите быть гибкими в отношении формата даты, поэтому вы хотите разрешить DD /ММ/ГГГГ и ДД ММ ГГГГ, а также формат ДД.ММ.ГГГГ (и еще интереснее, если вы хотите разрешить ДДММГГГГ — не говоря уже о ГГГГ-ММ-ДД, или ММ/ДД/ГГГГ, или…) Даты бесконечно развлекательный (для очень низкого уровня развлекательной ценности). - person Jonathan Leffler; 31.07.2016