C如果循环无法设置结构数据

时间:2014-08-29 03:46:35

标签: c struct

这让我困扰了几天。我尝试过搜索,但大多只是struct ...

的定义

在if循环中,我设置了2个结构变量,但它们都没有正确。 guests[x].plusone停留在0,guests[x].plusonefood只是空。但是,如果我在循环外部设置它们(使用相同的行),则没有问题。我的编译器没有显示警告或错误。我错过了什么?

这是我与C的第一个项目,所以请指出你注意到的任何其他事项。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct guestinfo
{
    char name[50];
    short int plusone;
    char food[50];
    char plusonefood[50];
};

char temp[5];

char setfood (int f)
{
    char foodtemp[f];

    int x;
    for (x=0; x < f; x++)
    {
        printf("Food option %d:\n", (x+1));
        fgets(&foodtemp[x],100,stdin);
    }

    return *foodtemp;
}

int main ()
{

    int number_of_rsvp=0;
    int number_of_food=0;

    printf("Number of food choices:\n");
    fgets(temp,5,stdin);
    number_of_food = atoi (temp);

    while (number_of_food <= 0)
    {
        printf("Please enter a number greater than 0\n");
        fgets(temp,5,stdin);
        number_of_food = atoi (temp);
    }

    char food [50] [number_of_food];
    **food = setfood(number_of_food);

    printf("Number of RSVPs:\n");
    fgets(temp,5,stdin);
    number_of_rsvp = atoi (temp);

    while (number_of_rsvp <= 0)
    {
        printf("\nPlease enter a number greater than 0\n");
        fgets(temp,5,stdin);
        number_of_rsvp = atoi (temp);
    };

    struct guestinfo guests[number_of_rsvp];

        int x;
        int f;
        for (x=0; x < number_of_rsvp; x++)
        {
            // add input validation to this section
            printf("Guest Number %d:\n\nGuest Name:\n", (x+1));
            fgets(guests[x].name,50,stdin);
            printf("Food Choice #:\n");
            fgets(temp,3,stdin);
            f = atoi(temp);
            f--;
            *guests[x].food = food [50] [f];
            printf("Plus One? Y/N\n");
            fgets(temp,3,stdin);
        }

            if (strchr (temp,'Y') != NULL || strchr (temp,'y') != NULL) //This loop
            {
                guests[x].plusone = 1;
                printf("Plus one food choice #:\n");
                fgets(temp,3,stdin);
                f = atoi(temp);
                f--;
                *guests[x].plusonefood = food [50] [f];
            }

            else if (strchr (temp,'N') != NULL || strchr (temp,'n') != NULL)
            {
                guests[x].plusone = 0;
            };


    FILE *guestlist = fopen ("guestlist.txt","w");
// debugging
    printf("%d\n",guests[0].plusone);
    printf("%s\n",guests[0].plusonefood);


    for (x=0; x < number_of_rsvp; x++)
    {
        fprintf(guestlist,"Guest Number %d:\n\nName: %s\nFood Choice: %s\n",(x+1),guests[x].name,guests[x].food);

    switch (guests[x].plusone)
    {
        case 1:
        {
        fprintf(guestlist,"Plus One: Yes\n\tPlus One Food: %s\n\n",guests[x].plusonefood);
        break;
        }
        case 0:
        {
        fprintf(guestlist,"Plus One: No\n\n");
        break;
        }
        default:
        {
        break;
        }
    }
    }

    fclose (guestlist);

    printf("Printing Guest List...\n");


    return 0;
}

1 个答案:

答案 0 :(得分:3)

问题是您正在访问无效的内存位置 该数组包含number_of_rsvp个元素 您的for()循环会对变量x进行交互,直至值number_of_rsvp并退出。
之后,x的值等于number_of_rsvp 由于数组的索引只能从0转到number_of_rsvp - 1,因此guests[x]元素guests[number_of_rsvp]超出范围。