1. 必做题 请编写一个函数 GetBirthDate, GetBirthDate 的功能是将一个身份证号码中的出生日期转为整数,其中 GetBirthDate 函数的调用形式已经在 main 函数内给出。 1. int main(void){ 2. char id[]="51010219990506001X"; 3. int date=0,year,month,day; 4. 5. date= GetBirthDate(id); 6. year=date/10000; 7. month=date/100%100; 8. day=date%100; 9. printf("%04d-%02d-%02d\n",year,month,day); 10. 11. return 0; 12. } 2. 选做题 a) 请分析下列程序中指针的使用有什么问题。 #include int main(void){ int *p; *p = 8; printf("%d", *p); return 0; } b) 请分析下列程序中指针的使用有什么问题。 #include int* fun(){ int n = 8; return &n; } int main(void){ int *p; p = fun(); printf("%d", *p); return 0; } c) 请分析下列程序中指针的使用有什么问题。 #include int main(void){ char *p = "abc"; *p = '@'; printf("%s", p); return 0; }
时间: 2024-01-17 22:04:52 浏览: 104
1. GetBirthDate函数的实现如下:
```c
int GetBirthDate(char *id){
int year = (id[6]-'0')*1000 + (id[7]-'0')*100 + (id[8]-'0')*10 + (id[9]-'0');
int month = (id[10]-'0')*10 + (id[11]-'0');
int day = (id[12]-'0')*10 + (id[13]-'0');
return year*10000 + month*100 + day;
}
```
该函数将身份证号码中的出生日期提取出来,并且以整数的形式返回,具体实现方法是通过字符串下标获取身份证号码中对应的数字字符,然后将其转为整数相加得到年月日,最终返回一个整数表示出生日期。
2. a) 在该程序中,指针p没有被初始化,即没有被赋值为指向某个合法的内存地址,直接使用*p会导致未知的结果,可能会崩溃程序。
正确的做法应该是先为指针p分配一块内存空间,然后将*p赋值为8,如下所示:
```c
int main(void){
int *p = (int *)malloc(sizeof(int));
*p = 8;
printf("%d", *p);
free(p);
return 0;
}
```
b) 在该程序中,fun函数返回的是一个指向局部变量n的指针,当fun函数执行完毕之后,n所在的内存空间就被释放了,p指向的内存空间已经不再是有效的,使用*p会导致未知的结果,可能会崩溃程序。
正确的做法应该是在fun函数中动态分配一个内存空间,并将n的值赋值给该内存空间,然后返回该内存空间的指针,如下所示:
```c
int* fun(){
int *p = (int *)malloc(sizeof(int));
*p = 8;
return p;
}
int main(void){
int *p = fun();
printf("%d", *p);
free(p);
return 0;
}
```
c) 在该程序中,指针p指向了一个常量字符串"abc",该字符串存储在程序的只读数据段中,不允许修改,但是通过*p = '@'尝试修改该字符串的值,会导致程序崩溃或者未知的结果。
正确的做法应该是将"abc"复制到一个可读写的内存空间中,然后将指针p指向该内存空间,如下所示:
```c
int main(void){
char str[] = "abc";
char *p = str;
*p = '@';
printf("%s", p);
return 0;
}
```
阅读全文