我的程序会读取以下数据:日期,距离和时间。
例如,输入看起来像:
日期: 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
答案 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", ¶m[i].timedate.day);
printf("enter time %d:", i+1);
scanf("%d", ¶m[i].timedate.month);
printf("enter time %d:", i+1);
scanf("%d", ¶m[i].timedate.year);
printf("enter time %d:", i+1);
scanf("%d", ¶m[i].timedate.hour);
printf("enter time %d:", i+1);
scanf("%d", ¶m[i].timedate.minute);
printf("enter time %d:", i+1);
scanf("%d", ¶m[i].timedate.second);
printf("enter time %d:", i+1);
scanf("%d", ¶m[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 = ¶m[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;
}