Как изменить переменную из структуры из целого числа в строку?

#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".... . Так много для «Этого не должно быть». С a const это было бы еще лучше, поскольку изменение любого из них внутри программы вызывает UB.