簡體   English   中英

C將值存儲在數組中

[英]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", &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;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM