#c #struct #switch-statement
#c #структура #оператор переключения
Вопрос:
Вопрос предполагает
typedef struct {
int day;
int month;
int year;
} Date;
Date mfgDate = {17, 10, 2016}, expiryDate;
printf("%d-%d-%d", mfgDate.day, mfgDate.month, mfgDate.year);
Делая это, я могу отобразить дату в виде 17-10-2016, вопрос требует, чтобы я отобразил дату в форме DD-MMM-YYYY, которая равна 17-OCT-2016, как я могу это сделать? в вопросе содержится подсказка, которая заключается в использовании оператора switch, но, похоже, я не могу понять, как это сделать, большое спасибо за помощь.
Комментарии:
1. Вы могли бы сохранить время в a
struct tm
и преобразовать его сstrftime()
помощью . И имейте в виду, чтоDD-MM-YYYY
это не очень хороший формат, лучше было быYYYY-MM-DD
(ISO8601), поскольку он однозначен и сортируется правильно.2. Второстепенный: чтобы напечатать день как
DD
, используйте"d"
.
Ответ №1:
Вы могли бы использовать strftime()
для этого:
char buffer[BUFFER_SIZE];
errno=0; //clear errno since we need it to detect errors in strftime()
//tm_year is years since 1900
//%d prints the day of the month, %B or %b the month name according to the locale
//and %Y prints the year, results in the format DD-MMMM-YYYY
int r = strftime
(buffer, sizeof buffer, "%d-%b-%Y", amp;(struct tm){.tm_year=2016-1900, .tm_mon=9, .tm_mday=17} );
if(!r amp;amp; errno)
{
//do some error handling here
}
printf("%sn",buffer);
Комментарии:
1. Использование OP
17, 10, 2016
добавило бы ясности. Возможно.tm_year=2016-1900, .tm_mon=10-1, .tm_mday=17
?2.
%b
это более близкое соответствие для OP, поскольку в нем используется сокращенное имя (хотя, вероятно, смешанный регистр, в отличие от OP подразумевается необходимость прописных букв).%B
для полного имени, тем не менее, это хороший подход.
Ответ №2:
Если вы только начинаете с C и не изучали массивы, оператор switch является жизнеспособным выбором, только для выполнения
const char* monthname(int month)
{
switch (month) {
case 1: return "JAN";
case 2: return "FEB";
// you can fill the remaining month yourself here
case 12: return "DEC";
// handle the error case
default: return "???";
}
}
чтобы напечатать вашу дату, используйте:
printf("%d-%s-%d", mfgDate.day, monthname(mfgDate.month), mfgDate.year);
Комментарии:
1. Вы забыли
switch()
инструкцию? 🙂2. @ryyker, да, я это сделал. Исправлено.
3. «не изучали массивы» -> Обратите внимание, что
"JAN"
,"%d-%s-%d"
, … являются массивами.4. @chux-ReinstateMonica, да, технически это массивы. Однако они здесь не используются как массивы. Пока вы используете только постоянные строки, как это часто бывает, когда вы только начинаете с C, вы можете обойтись без этих знаний.
5. OP «может обойтись без этого знания.», но этот в остальном хороший ответ также может обойтись без «… и не узнали о массивах «.
Ответ №3:
Просто укажите имена месяцев в таблице.
char *months[] = {"JAN", "FEB","MAR", ......};
printf("%d-%s-%d", mfgDate.day, months[mfgDate.month - 1], mfgDate.year);
Комментарии:
1. Я думаю, это должно быть
const char *months[]
илиchar months[][4]
.2. @12431234123412341234123 это может быть, но это не обязательно.
3. @0____________ Это не сработало с вашим предыдущим решением
char *months = {"JAN", "FEB"....
. Так много для «Этого не должно быть». С aconst
это было бы еще лучше, поскольку изменение любого из них внутри программы вызывает UB.