Как напечатать дни недели, используя элемент структуры? - PullRequest
1 голос
/ 06 марта 2019

Я хочу напечатать дни недели в этой программе, но она не работает, что я могу сделать, чтобы это исправить?

#include<stdio.h>
struct month{
    int date[12];
    char day[7];
}mon;
main()
{   int i;

    strcpy(mon.day[0],"Sunday");
    strcpy(mon.day[1],"Monday");
    strcpy(mon.day[2],"Tuesday");
    strcpy(mon.day[3],"Wednesday");
    strcpy(mon.day[4],"Thursday");
    strcpy(mon.day[5],"Friday");
    strcpy(mon.day[6],"Saturday");

    for(i=0;i<7;i++)
    {
        printf("Day %d is %c\n",i+1,mon.day[i]);
    }

}

Ответы [ 3 ]

4 голосов
/ 06 марта 2019

Вы пытаетесь сохранить строки в char.Однако строка является массивом char.Вместо этого:

char day[7];

Вам нужно что-то вроде:

char day[7][16];

Теперь у вас есть 16 char, чтобы поместиться в будний день, и у вас есть это семь раз, один дляежедневно.Кроме того, ваша печать неверна.Для печати строк вам нужно %s, а не %c.%c только для одного символа:

printf("Day %d is %s\n", i + 1, mon.day[i]);

Другой способ сделать это состоит в том, чтобы иметь массив char* вместо char и хранить только адрес строк;чем копировать строки:

char *day[7];

Затем сохраните адреса следующим образом:

mon.day[0] = "Sunday";
mon.day[1] = "Monday";
mon.day[2] = "Tuesday";
...

И напечатайте его так же, с %s.

2 голосов
/ 06 марта 2019

Если вы попытаетесь скомпилировать вашу программу, ваш компилятор выдаст вам определенные предупреждения. Как

  • Задача 1:

    source_file.c:10:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
     main()
     ^
    

    Подходящая подпись main() - int main(void) для обычных размещенных сред.

  • Задача 2:

    source_file.c: In function ‘main’:
    source_file.c:13:5: warning: implicit declaration of function ‘strcpy’ [-Wimplicit-function-declaration]
         strcpy(mon.day[0],"Sunday");
         ^
    source_file.c:13:5: warning: incompatible implicit declaration of built-in function ‘strcpy’
    source_file.c:13:5: note: include ‘<string.h>’ or provide a declaration of ‘strcpy’
    

    Вам необходимо включить заголовочный файл string.h, который содержит объявление для strcpy().

  • Задача 3:

    source_file.c:13:12: warning: passing argument 1 of ‘strcpy’ makes pointer from integer without a cast [-Wint-conversion]
         strcpy(mon.day[0],"Sunday");
    

    Это означает, что первый аргумент strcpy() ожидает char *, но вы передаете char, приведенный к int.

    Это самый важный момент, как вы видите, вам нужно передать буфер , который может содержать содержимое из скопированной строки. Это вам нужно

  • day для двумерного массива

  • используйте day[i] для хранения контента
  • используйте %s для печати его содержимого.
0 голосов
/ 06 марта 2019

Для констант, таких как день и месяц, лучше конструировать, как показано ниже, если вы не практикуете с struct.

#include<stdio.h>
int main()
{   
    const char *day[] = {"Sunday", "Monday", "Tuesday","Wednesday", "Thursday", "Friday", "Saturday" };
              //^^^^^ array of strings.
    for(int i=0;i<7;i++)
        printf("Day %d is %s\n",i+1,day[i]);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...