2012-11-04 97 views
1

我是新的C和IM在一個奇怪的情況下使用char型日期:我試圖更新我曾作爲字符串輸入日期和我的代碼是問題在C

typedef struct Employee 
{ 
char fname[20]; 
char lname[20]; 
int eme_id; 
int emr_id; 
char department[20]; 
int age; 
char join_date[20]; 
float bsal; 
float pol_value; 
char pol_start_date[20]; 
char pol_end_date[20]; 
float premium; 
float pre_payment; 
char pre_pay_date[20]; 
int pre_status;/* 0 then not paid 1 then paid*/ 
float bonus; 
}Employee; 


char *update_date(char *dat) 
{ 

char *result = NULL; 
printf(dat); 
result = strtok(dat, "/"); 
int date[3]; 
int i=0; 
while(result != NULL) { 
    printf("result is \"%s\"\n", result); 
    date[i] = atoi(result); 
    printf("%d\n", date[i]); 
    i++; 
    result = strtok(NULL, "/"); 
} 

if(date[1]!=12) 
{ 
    date[1]++; 
} 
else 
{ 
    date[1]=1; 
    date[2]++; 
} 

char a[20]; 
char b[20]; 
char c[20]; 
char d[20]; 
sprintf(a, "%d", date[0]); 
sprintf(b, "%d", date[1]); 
sprintf(c, "%d", date[2]); 

strcpy (d,a); 
strcat (d,"/"); 
strcat (d,b); 
strcat (d,"/"); 
strcat (d,c); 

printf(d); 
return d; 
} 

這裏此功能工作得很好,但是當IM調用它的側像

while(fread(&eme,recsize_eme,1,fq)==1) 
      { 

       char *hell; 
       hell = update_date(eme.pre_pay_date); 
       printf("%s",hell); 
      } 

其他功能,現在它打印的任意文本..:/ PLZ有人幫我出

+1

爲什麼包含Employee結構?它有什麼相關性? –

+0

員工結構是組織中必須是唯一的(我確保)員工的結構,** eme **是Employee結構的一個實例,並且我想在一個月前編輯eme.pre_pay_date,這不會發生在第一種情況 – Abhishek

回答

2

在FI第一個代碼

char d[20]; 
... ... 
return d; 

「d [20]」在棧上。 您正在返回一個指向堆棧上數據的指針。 只要update_date()返回的所有局部變量現在都是無效的。

在返回之前打印d []的值,所以沒有問題。

strok()可能是最好的避免。 它修改你傳入的字符串,並保持靜態,這兩個都是嚴重的陷阱,並且經常會導致微小的錯誤。

這裏有幾個替代實現。 (當然,在生產代碼中,你應該避免編寫代碼來解析日期/時間,有OS和庫函數來實現這一點,有許多微妙之處)。

// Scanf can do parsing for you 
int date[3]; 
int n; 
n = sscanf(dat, "%d/%d/%d", &date[0], &date[1], &date[2]); 
if (n == 3) 
{ 
    // OK, we got 3 integers... 
} 


// atoi() stops on non-digits, use it instead of strtok 
char *result = dat; 
int date[3]; 
int i = 0; 
while (i < 3 && result) 
{ 
    date[i++] = atoi(result); 
    result = strchr(result, '/'); 
    if (result) 
    { 
     ++result; // Skip the '/' 
    } 
} 
1

我知道這是不是與你的問題,但要注意的是,除了這一點:如果你想

char d[20]; 
sprintf(d, "%d/%d/%d", date[0], date[1], date[2]); 

char a[20]; 
char b[20]; 
char c[20]; 
char d[20]; 
sprintf(a, "%d", date[0]); 
sprintf(b, "%d", date[1]); 
sprintf(c, "%d", date[2]); 

strcpy (d,a); 
strcat (d,"/"); 
strcat (d,b); 
strcat (d,"/"); 
strcat (d,c); 

你可以簡單地這樣做請安全使用snprintf

char d[20]; 
snprintf(d, sizeof d, "%d/%d/%d", date[0], date[1], date[2]); 

這樣做,你擺脫了臨時緩衝區,並消除了使用strcat的低效率。請注意,無論何時使用strcat,函數都必須從字符串的開頭開始,找到結尾,然後複製源字符串。