C:结构、带有月和日输入的数组

C:结构、带有月和日输入的数组,c,arrays,struct,C,Arrays,Struct,我正在开发一个程序,当用户输入月数和日数时,程序将打印出月数和日数(年初至今)。例如,如果用户输入12 30,程序将打印12月(12月)30日,表示年初至今364天。该计划不需要担心闰年。我已经把代码贴在下面了。我的程序不起作用,我不知道为什么。我想我的问题是试图从结构month months中提取月号和名称,但我不确定。我正在使用MSV,当我尝试使用调试器时,我会收到有关错误的警告,并被告知“运行上一次成功的构建”(没有) 我得到以下错误: 第55、57、58行上的“不允许使用类型名称” “月

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

我得到以下错误:

  • 第55、57、58行上的“不允许使用类型名称”
  • “月”:在第55、57、58行上非法使用此类型作为表达式
  • “.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;
    }
    
    #包括
    #包括
    int finddata(int月,int天);
    结构月
    {
    字符名[10];
    char-abbrev[4];
    国际日;
    国际货币基金组织;
    };
    结构月份[12]=
    {
    {“一月”、“一月”、31、1},
    {“二月”、“二月”、28、2},
    {“三月”,“三月”,31,3},
    {“四月”,“四月”,30,4},
    {“五月”,“五月”,31,5},
    {“六月”,“六月”,30,6},
    {“7月”、“7月”、“31日、7日},
    {“8月”、“8月”、31日、8日},
    {“9月”、“9月”、30日、9日},
    {“10月”、“10月”、31日、10日},
    {“11月”、“11月”、30日、11日},
    {“12月”、“12月”、31日、12日}
    };
    int main()
    {
    结构月用户数据;
    做
    {
    printf(“输入月和日编号:”);
    scanf_s(“%d%d”、&userdata.monumb、&userdata.days);
    finddata(userdata.monumb,userdata.days);
    }而((userdata.monumb>0)和&(userdata.monumb<13));
    返回0;
    }
    int finddata(int个月,int天)
    {
    int i;
    int-total=0;
    对于(i=1;i!=month.monumb[i];i++)/**(第55行)**
    {
    puts(月名[i]);//**(第57行)**
    看跌期权(月份缩写[i]);//**(第58行)**
    }
    printf(“%d”表示月份);
    如果(月=1)
    {
    总数=天;
    }
    否则,如果(月=2)
    {
    总数=天数+31天;
    }
    否则,如果(月=3)
    {
    总计=31+28+天;
    }
    否则,如果(月==4)
    {
    总计=31+28+31+天;
    }
    否则,如果(月=5)
    {
    总计=31+28+31+30天;
    }
    否则,如果(月==6)
    {
    总计=31+28+31+30+31天;
    }
    否则,如果(月==7)
    {
    总数=(31*3)+28+(30*2)+天;
    }
    否则,如果(月==8)
    {
    总数=(31*4)+28+(30*2)+天;
    }
    否则,如果(月==9)
    {
    总数=(31*5)+28+(30*2)+天;
    }
    否则,如果(月=10)
    {
    总数=(31*5)+28+(30*3)+天;
    }
    否则,如果(月=11)
    {
    总数=(31*6)+28+(30*3)+天;
    }
    否则,如果(月=12)
    {
    总数=(31*6)+28+(30*4)+天;
    }
    其他的
    {
    //空白
    }
    printf(“年初至今的%d天”,总计);
    返回0;
    }
    

  • 当month.monumb是整数时,finddata中的for循环将其视为数组。也请使用更好的名字。我怀疑您不清楚结构数组是如何工作的

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

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

    此循环中有几个错误:

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

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

    “不起作用”不是一个好的问题描述。请说明输入、预期输出和实际输出。您是否使用了调试器甚至基本的调试打印语句来跟踪程序的执行?哪里开始出错?我建议您在
    finddata
    函数中使用
    switch
    语句来表示
    months
    表示(I=1;I!=month.monumb[I];I++)
    您想在那里做什么?我们已经在您今天早些时候发布的已删除问题中指出了这方面的问题。变量
    month
    在哪里定义?为什么对非数组的
    monumb
    使用数组访问?您的代码是否编译?
    for(i=1;i!=month.monumb[i];i++){puts(month.name[i]);puts(month.abbrev[i]);}printf(“%d”表示月份)-->
    printf(“%s(%s)%d”表示“月.名称[months-1],月.缩写[months-1],天”)作为补充,您的结构中还有一些冗余信息。您存储月号,但数组中的索引也将对应月号。我试图获取用户输入的月数,并将其与month months[12]结构数组进行比较。如果有匹配项,则应打印月份名称和缩写。这就是我想做的,我现在很难接受。