0

我的程序读取以下数据:DateDistanceTime

例如,输入看起来像:

日期: 2013 年 10月 10 日

距离(米): 500

时间 (HH:MM:SS): 01:20:05

我想将所有这些信息存储在一个数组中。问题是我希望用户多次输入日期、距离和时间,而程序必须将所有数据保存在一个数组中。

我不能这样存储它,因为那我怎么知道哪个索引是日期索引?我应该如何存储时间?我不能用:.

arr[0] = 10.10.2013

arr[1] = 500

arr[2] = 012005

arr[3] = 22.10.2013

arr[4] = 200

arr[5] = 000510

4

2 回答 2

1

你可以做一个struct

struct Data{
   Date date;
   Distance distance;
   Time time;
}

然后声明一个数组Data并像这样使用它:

Data arr[5];
arr[0].date = //some date;
arr[0].distane =//some distance
arr[0].time=//some time
于 2013-11-10T16:46:22.417 回答
1

因为你需要存储的数据类型,它需要 type char,所以它可以存储在字符串中。(即“10.10.2013”​​)
首先,定义一个structPARAM:

typedef struct {
   char date[20];
   char distance[20];
   char time[20];
} PARAM;

使用 PARAM 创建一个结构数组:

PARAM param[20];

现在,您可以像这样使用它,例如:

int main(void)
{
    strcpy(param[0].date, "10.10.2013");    
    strcpy(param[0].time, "05:02:10");    
    strcpy(param[0].distance, "500");
    //and so on for all the struct array elements, 0 through 20
    return 0;
}

或者,更好的是,根据需要使用printf()scanf()语句,您可以提示用户在循环中输入,并存储在您的结构数组中:

int main(void)
{
    int i;
    for(i=0;i<20;i++)
    {
        printf("enter date %d:", i+1);
        scanf("%s", param[i].date);


        printf("enter distance %d:", i+1);
        scanf("%s", param[i].distance);


        printf("enter time %d:", i+1);
        scanf("%s", param[i].time);
    }
    return 0;
}  

编辑关于评论中的问题因此我想最好将它们存储在 date.day、date.month 和 date.year 中。正确的? 这种方法可行,我将其包括在下面,但以这种方式输入数据有点乏味。我在下面包含了第二个示例,它可能会同时改进输入数据和存储数据。

因此,根据您的评论,有两种方法可以让您想到

,创建包含时间和日期的离散成员作为整数的结构成员:即

typedef struct {
    int day;
    int month;
    int year;
    int hour;
    int minute;
    int second;
}TIMEDATE;

将此结构用作PARAM struct; 的成员

typedef struct  {
    int distance;
    TIMEDATE timedate;
}PARAM;  

PARAM param[20];

现在,只需修改和扩展最后一个main()函数的示例,以包括扫描新结构成员的值。对于使用您的程序的人来说,这将更加乏味,但允许您将所有输入值保留为您所指示的数字。

//Note the changes in scanf format specifiers for int, "%d":
//     in all the statements
int main(void)
{
    int i;
    for(i=0;i<20;i++)
    {
        printf("enter date %d:", i+1);
        scanf("%d", &param[i].timedate.day);

        printf("enter time %d:", i+1);
        scanf("%d", &param[i].timedate.month);

        printf("enter time %d:", i+1);
        scanf("%d", &param[i].timedate.year);

        printf("enter time %d:", i+1);
        scanf("%d", &param[i].timedate.hour);

        printf("enter time %d:", i+1);
        scanf("%d", &param[i].timedate.minute);

        printf("enter time %d:", i+1);
        scanf("%d", &param[i].timedate.second);

        printf("enter time %d:", i+1);
        scanf("%d", &param[i].distance);
    }
    return 0;
}

,修改第一种方法以包括使用字符串整数,都在同一个结构中。这将使用户用户更容易输入时间和日期信息,并使您可以更轻松地操作数据。还有一个好处,它将演示如何将用户输入的字符串数据解析为整数数据。

typedef struct {
    char date[20];//keep as char
    char time[20];//keep as char
    int distance; //changed to int
    TIMEDATE timedate;//container for in data   
} PARAM;

//use PARAM to create an array of your struct:

PARAM param[20], *pParam; //create a pointer to pass

int GetIntData(PARAM *p, int index);//prototype for new function

//Note the changes in scanf format specifiers for int, "%d":
//     in all the statements
int main(void)
{
    int i, loops;
    pParam = &param[0]; //initialize pointer to struct

        printf("How many sets of data would you like to enter? :");
        scanf("%d", &loops);


    for(i=0;i<loops;i++)
    {
        printf("enter date (eg:MM.DD.YYYY): %d:", i+1);
        scanf("%s", pParam[i].date);

        printf("enter time (eg HH:MM:SS): %d:", i+1);
        scanf("%s", pParam[i].time);

        printf("enter distance %d:", i+1);
        scanf("%d", &pParam[i].distance);

        GetIntData(pParam, i);
    }
    return 0;
} 
//reads string members into integer members
int GetIntData(PARAM *p, int index)
{
    char *buf=0;
    if(strstr(p[index].date, ".")==NULL) return -1;

    p[index].timedate.month = atoi(strtok(p[index].date, ".")); 
    p[index].timedate.day = atoi(strtok(NULL, "."));    
    p[index].timedate.year = atoi(strtok(NULL, "."));   

    if(strstr(p[index].time, ":")==NULL) return -1;
    buf=0;

    p[index].timedate.hour = atoi(strtok(p[index].time, ":"));  
    p[index].timedate.minute = atoi(strtok(NULL, ":")); 
    p[index].timedate.second = atoi(strtok(NULL, ":"));

    return 0;

}
于 2013-11-10T16:57:03.787 回答