[英]C store values in an array
我的程序讀取以下數據: 日期 , 距離和時間 。
例如,輸入看起來像:
日期: 2013年10月10日
距離(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
你可以制作一個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
因為您需要存儲的數據類型,它需要類型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;
}
二 ,修改第一種方法,包括使用字符串和整數,所有這些都在同一個結構中。 這將使用戶用戶更容易輸入時間和日期信息,並且可以更輕松地操作數據。 還有一個好處,它將演示如何將用戶輸入的字符串數據解析為整數數據。
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.