C将值存储在数组中

时间:2013-11-10 16:42:24

标签: c

我的程序会读取以下数据:日期距离时间

例如,输入看起来像:

日期: 10.10.2013

距离(m): 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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

由于您需要存储的数据类型,它需要类型char,因此它可以存储在字符串中。 (即“10.10.2013”​​)
首先,定义struct PARAM:

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()语句,您可以提示用户输入循环,并且存储在struct数组中:

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中。对吗?这种方法可行,我将其包含在下面,但以这种方式输入数据会更加冗长乏味。我在下面添加了第二个示例,它可以改进,输入数据和存储数据。

所以,根据你的评论, 有两种方式可以想到

ONE ,创建包含时间和日期的离散成员的结构成员:即

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;
}

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

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;

}