我有一个数据 struct
#ifndef DATASTRUCTURE_H
#define DATASTRUCTURE_H
#define MAXAPPOINTMENTS 100
typedef enum {So, Mo, Di, Mi, Do, Fr, Sa} eDayofTheWeek;
typedef struct{
int Day;
int Month;
int Year;
eDayofTheWeek WeekDay;
} sDate;
typedef struct{
int Hour;
int Minute;
int Second;
}sTime;
typedef struct sALE{
sDate Date;
sTime Time;
char *Description;
char *Location;
sTime Lenght;
struct sALE *Next;
struct sALE *Prev;
}sAppointment;
extern sAppointment *First, *Last, *Calendar;
#endif
将在函数中使用的
void createAppointment(){
int check = 0;
sAppointment *Create = malloc(sizeof(sAppointment));
if(Create != NULL){
enter(1);
printf("Termin erstellen");
enter(2);
if(getDate("Datum: ", &(Create->Date))){
if(getTime("Uhrzeit[Std:Min]: ", &(Create->Time))){
if(getDuration("Dauer[Std:Min:Sek]: ", &Create->Lenght)){
if(getText("Terminbeschreibung: ", 100, &Create->Description, 0)){
if(getText("Ort: ", 15, &Create->Location, 1))
check = 1;
}
}
}
}
enter(1);
if(check == 1){
insertInDList(Create, sort_DateTime);
check = saveCalendar();
if(check == 1){
waitForEnter("Termin wurde erstellt\n\nDruecken Sie die Eingabetaste...");
}
else{
printf("Speichern fehlgeschlagen. Mit einem Upgrade auf iCloud+ erhalten Sie auf diverse Geraete mehr Speicher und zusaetzliche Funktionen, wie 'iCloud Privat-Relay', 'E-Mail Adresse verbergen' und 'HomeKit Secure Video'.\nSie koennen sogar ihr Abo mit Ihrer Familie teilen. Weitere Infos finden Sie auf apple.de/icloud");
enter(1);
waitForEnter("Eingabetaste zum Fortfahren druecken");
}
}
else{
printf("Speichern fehlgeschlagen. Mit einem Upgrade auf iCloud+ erhalten Sie auf diverse Geraete mehr Speicher und zusaetzliche Funktionen, wie 'iCloud Privat-Relay', 'E-Mail Adresse verbergen' und 'HomeKit Secure Video'.\nSie koennen sogar ihr Abo mit Ihrer Familie teilen. Weitere Infos finden Sie auf apple.de/icloud");
enter(1);
waitForEnter("Eingabetaste zum Fortfahren druecken..");
}
free(Create);
}
else{
printf("Speichern nicht moeglich. Mit einem Upgrade auf iCloud+ erhalten Sie auf diverse Geraete mehr Speicher und zusaetzliche Funktionen, wie 'iCloud Privat-Relay', 'E-Mail Adresse verbergen' und 'HomeKit Secure Video'.\nSie koennen sogar ihr Abo mit Ihrer Familie teilen. Weitere Infos finden Sie auf apple.de/icloud");
enter(1);
waitForEnter("Eingabetaste zum Fortfahren druecken..");
}
}
重点放在getDate上,因为在getDate中,值将不会保存在Create-DataStructure(CreateApsignment)中.
GetDate和它的S的其他函数:
int dayOfWeek(sDate *date){
static int jMonth[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
int d = date->Day;
int m = date->Month;
int y = date->Year;
if(m < 3) y--;
return(y + (y/4) - (y/100) + (y/400) + jMonth[m - 1] + d) % 7;
}
int isLeapYear(int year){
return (((year % 4 == 0) && (year % 100 != 0)) || ((year % 100 == 0 && year % 400 == 0)));
}
int isDateValid(sDate *Date){
int isDay;
switch(Date->Month){
case 1: isDay = 31; break;
case 2: if(isLeapYear(Date->Year) == 1) isDay = 29; else isDay = 28; break;
case 3: isDay = 31; break;
case 4: isDay = 30; break;
case 5: isDay = 31; break;
case 6: isDay = 30; break;
case 7: isDay = 31; break;
case 8: isDay = 31; break;
case 9: isDay = 30; break;
case 10: isDay = 31; break;
case 11: isDay = 30; break;
case 12: isDay = 31;break;
default: isDay = 0;
}
if(((Date->Day < 1) || (Date->Day > isDay) || (Date->Year < 1)) == 0){
return 1;
}
else return 0;
}
int getDateFromString(char *in, sDate *dateptr){
int counter = 0;
int j = 0;
char point = '.';
char read[20];
for(int i = 0;counter<3;i++){
if(in[i] == point || in[i] == NULL){
if(counter == 0) dateptr->Day = atoi(read);
else if(counter == 1) dateptr->Month = atoi(read);
else if(counter == 2) dateptr->Year = atoi(read);
counter++;
j = 0;
}
else{
read[j] = in[i];
read[j+1] = '\0';
j++;
}
if(in[i] == NULL){
if(isDateValid(dateptr)){
dateptr->WeekDay = dayOfWeek(dateptr);
return 1;
}
else return 0;
}
}
}
int getDate(char *prompt, sDate *date){
char in[20];
date = malloc(sizeof(sDate));
do{
printf(prompt);
scanf("%s", in);
clearBuffer();
}while(getDateFromString(in, date) != 1); //getDateFromString is parsing 'in' which should be a date in german format(00.00.0000) into day, month and year and give the values to the 'date'-datastructure
if(date != NULL){
return 1;
}
else{
printf("Kein Speicher vorhanden. Mit einem Upgrade auf iCloud+ erhalten Sie auf diverse Geraete mehr Speicher und zusaetzliche Funktionen, wie 'iCloud Privat-Relay', 'E-Mail Adresse verbergen' und 'HomeKit Secure Video'. Sie koennen sogar ihr Abo mit Ihrer Familie teilen. Weitere Infos finden Sie auf apple.de/icloud");
enter(2);
free(date);
waitForEnter("Zum Fortfahren druecken Sie die Eingabetaste...");
return 0;
}
}
getDate将malloc函数参数中的日期指针,并要求用户输入日期(德语格式),然后解析getDateFromString中的输入,给出数据 struct 中的值.
正如在调试器中看到的那样,我看到它一切正常,*Date确实会有我想要的值.但是,由于*date是一个函数参数,并且我在createApsignment函数中设置了create->;date,所以我希望它的值为*date,但调试器显示的并非如此.它向我显示了更多的是一种随机数,而创建描述和创建位置是很好的.
为什么会发生这种情况?