C:结构,包含月和日输入的数组

时间:2016-12-06 04:23:55

标签: c arrays struct

我正在开发一个程序,当用户输入月份编号和日期编号时,程序将打印出月份和天数(年初至今)。例如,如果用户输入12 30,程序将打印12月(DEC)30表示年初至今364天。该计划不需要担心闰年。我已经发布了以下代码。我的程序不起作用,我不知道为什么。我认为我的问题是试图从结构月月中提取月份数和名称,但我不确定。我正在使用MSVS,当我尝试使用调试器时,我收到有关错误的警告,并被告知“为最后一次成功构建运行”(没有一个)。

我收到以下错误:

    第55,57,58行
  1. “不允许输入姓名”
  2. 'month':非法使用此类型作为第55,57,58行的表达
  3. 左边的'.abbrev'/'。months'/'。monumb'必须在第55,57,58行上有class / struct / union

     #include <stdio.h>
    #include <string.h>
    
    int finddata(int month, int days);
    
    struct month 
    {
        char name[10];
        char abbrev[4];
        int days;
        int monumb;
    };
    
    struct month months[12] =
    {
        { "January", "jan", 31, 1 },
        { "February", "feb", 28, 2 },
        { "March", "mar", 31, 3 },
        { "April", "apr", 30, 4 },
        { "May", "may", 31, 5 },
        { "June", "jun", 30, 6 },
        { "July", "jul", 31, 7 },
        { "August", "aug", 31, 8 },
        { "September", "sep", 30, 9 },
        { "October", "oct", 31, 10 },
        { "November", "nov", 30, 11 },
        { "December", "dec", 31, 12 }
    };
    
    int main()
    {
        struct month userdata;
    
        do
        {
            printf("Enter month and day number:");
    
            scanf_s("%d %d", &userdata.monumb, &userdata.days);
    
            finddata(userdata.monumb, userdata.days);
    
        } while ((userdata.monumb > 0) && (userdata.monumb < 13));
    
    
        return 0; 
    }
    
    
    
    int finddata(int months, int days)
    {
        int i;
        int total = 0;
    
        for (i = 1; i != month.monumb[i]; i++) //**(line 55)**
        {
            puts(month.name[i]); //**(line 57)**
            puts(month.abbrev[i]); //**(line 58)**
        }
        printf("%d means", months);
    
        if (months == 1)
        {
            total = days;
        }
        else if (months == 2)
        {
            total = days + 31;
        }
        else if (months == 3)
        {
            total = 31 + 28 + days;
        }
        else if (months == 4)
        {
            total = 31 + 28 + 31 + days;
        }
        else if (months == 5)
        {
            total = 31 + 28 + 31 + 30 + days;
        }
        else if (months == 6)
        {
            total = 31 + 28 + 31 + 30 + 31 + days;
        }
        else if (months == 7)
        {
            total = (31 * 3) + 28 + (30 * 2) + days;
        }
        else if (months == 8)
        {
            total = (31 * 4) + 28 + (30 * 2) + days;
        }
        else if (months == 9)
        {
            total = (31 * 5) + 28 + (30 * 2) + days;
        }
        else if (months == 10)
        {
            total = (31 * 5) + 28 + (30 * 3) + days;
        }
        else if (months == 11)
        {
            total = (31 * 6) + 28 + (30 * 3) + days;
        }
        else if (months == 12)
        {
            total = (31 * 6) + 28 + (30 * 4) + days;
        }
        else
        {
            //blank
        }
    
        printf("%d days YTD.", total);
    
        return 0;
    }
    

2 个答案:

答案 0 :(得分:0)

此循环中有几个错误:

    for (i = 1; i != month.monumb[i]; i++) //**(line 55)**
    {
        puts(month.name[i]); //**(line 57)**
        puts(month.abbrev[i]); //**(line 58)**
    }
  1. 您将全局struct month数组命名为months,但将其称为month。要匹配名称,请将定义更改为struct month month[12] =
  2. 您尝试索引结构元素而不是结构数组。将索引括号放在结构数组名称后面。即month[…].…
  3. 用于搜索months数组元素的循环条件是错误的,并且根本不需要循环,因为数组已排序。
  4. 要纠正第2点和第3点,请将整个循环替换为:

        puts(month[months-1].name);
        puts(month[months-1].abbrev);
    

答案 1 :(得分:-2)

finddata中的for循环将month.monumb视为一个数组,当它是一个整数时。请使用更好的名字。我怀疑你不清楚一系列结构是如何工作的。

因此,您不需要for循环来查找月份名称。你可以只索引数组;

    puts(months.name[userdata.monumb]); //**(line 57)**
    puts(months.abbrev[userdata.monumb]); //**(line 58)**