小张是同学会的负责人,但是复杂的联系信息让他很头痛,请你帮他写一个个人信箱的管理系统(人数小于30人),每个人包含3项信息:
姓名 (小于20个字符) 性别(Female = 女, Male = 男) 生日(年月日)
每个人用一个结构体表示,同时支持以下操作:
add Tim Male 1993 12 22
添加一个名为Tim的男生,出生年月日位1993-12-22
name Tim
返回姓名为Tim的人的所有信息
sex Male
返回所有男生的信息(sex Female返回女生信息)
quit
退出系统
样例输入
add Tim Male 1993 12 22
add Britney Female 1992 2 23
add Freddy Male 1989 4 22
name Britney
sex Male
quit
样例输出
Britney Female 1992-2-23
Tim Male 1993-12-22
Freddy Male 1989-4-22
1 #include<stdio.h> 2 #include<string.h> 3 int i=0; 4 struct stu 5 { 6 char name[20]; 7 char sex[6]; 8 char y[4]; 9 char m[2]; 10 char d[2]; 11 }zu[30];/*定义一个结构体,用来存放信息*/ 12 void add(char *p) 13 { 14 int x1,j,k,k1,k2,k3; 15 x1=strlen(p); 16 for(j=0;j<x1;j++) 17 if(p[j]==' ') 18 break;/*判断空格的位置,从而存放name*/ 19 strncpy(zu[i].name,p,j); 20 zu[i].name[j]='\0'; 21 22 for(k=j+1;k<x1;k++) 23 if(p[k]==' ') 24 break; 25 26 strncpy(zu[i].sex,p+j+1,k-j-1);/*判断空格的位置,从而存放sex*/ 27 zu[i].sex[k-j-1]='\0'; 28 for(k1=k+1;k1<x1;k1++) 29 if(p[k1]==' ') 30 break; 31 32 strncpy(zu[i].y,p+k+1,k1-k-1); 33 /*判断空格的位置,从而存放年份但是很奇怪存放的年份会连月份和日期都输出*/ 34 zu[i].y[k1-k-1]='\0'; 35 for(k2=k1+1;k2<x1;k2++) 36 if(p[k2]==' ') 37 break; 38 39 strncpy(zu[i].m,p+k1+1,k2-k1-1); 40 /*判断空格的位置,从而存放月份 同样连日期也输出*/ 41 zu[i].m[k2-k1-1]='\0'; 42 for(k3=k2+1;k3<x1;k3++) 43 if(p[k3]==' ') 44 break; 45 46 strncpy(zu[i].d,p+k2+1,k3-k2-1); 47 zu[i].d[k3-k2-1]='\0'; 48 /* printf("%s %s %s-%s-%s\n",zu[i].name,zu[i].sex,zu[i].y,zu[i].m,zu[i].d);*/ 49 i++; 50 } 51 void name(char *p) 52 { 53 int j; 54 for(j=0;j<i;j++) 55 { 56 if(strcmp(p,zu[j].name)==0) 57 printf("%s %s %s-%s-%s\n",zu[j].name,zu[j].sex,zu[j].y,zu[j].m,zu[j].d); 58 } 59 } 60 void sex(char *p) 61 { 62 int j; 63 for(j=0;j<i;j++) 64 { 65 if(strcmp(p,zu[j].sex)==0) 66 printf("%s %s %s-%s-%s\n",zu[j].name,zu[j].sex,zu[j].y,zu[j].m,zu[j].d); 67 } 68 } 69 int main() 70 { 71 char a[50]; 72 while(1) 73 { 74 gets(a); 75 if(strcmp(a,"quit")==0) 76 break; 77 else 78 { 79 if(a[0]=='a') 80 add(a+4); 81 if(a[0]=='n') 82 name(a+5); 83 if(a[0]=='s') 84 sex(a+4); 85 } 86 } 87 return 0; 88 }
令我感到奇怪的是 就算我strncpy时数字搞错了,但肯定复制的时候会连空格也复制上去,但是实际并不是这样(而是 19931221-1221-21这样的)
数组越界 ,一般范围是比实际大5位左右!