首页 新闻 会员 周边 捐助

字符数组移位复制(strncpy (,,))

0
悬赏园豆:5 [已解决问题] 解决于 2013-12-23 21:50

小张是同学会的负责人,但是复杂的联系信息让他很头痛,请你帮他写一个个人信箱的管理系统(人数小于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这样的)

 

瑾言的主页 瑾言 | 初学一级 | 园豆:199
提问于:2013-12-22 10:14
< >
分享
最佳答案
1

数组越界 ,一般范围是比实际大5位左右!

瑾言 | 初学一级 |园豆:199 | 2013-12-23 21:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册