c primer plus 第十四章课后编程4题

该博客展示了两个C语言程序,用于处理包含社会保险号、名、中间名和姓的结构体。程序a通过遍历结构体数组,修改中间名为只有一个字符的情况,将其后跟一个点和空字符。程序b则通过传递中间名的第一个字符到函数,生成新的中间名结构并替换原有结构。s_gets函数用于从用户输入中获取字符串。
摘要由CSDN通过智能技术生成

//编写有俩个成员的结构,第一个成员是社会保险号,第二个成员是有三个成员
//的结构,1.成员代表名。2。中间名。3。姓
//程序a.
#include <stdio.h>
#include <string.h>
#define MAX 20
#define SZ 5
struct fname{
char name[MAX];
char zname[3];
char sname[MAX];
};

struct card{
char number[MAX];
struct fname k;
};
char *s_gets(char *st,int n);

//接受结构指针,作用修改中间名。
void handle_sname(struct card *);

int main(void)
{
//声明一个包含5个card类结构的数组
struct card n[SZ];
//声明一个card类的指针,用于给函数传递结构
struct card *d;
d=&n[0];
int count=0;
int index=0; //
printf(“请输入社保号。\n”);
printf(“按回车键结束。\n”);
while(count<5 && s_gets(n[count].number, MAX)!=NULL
&& n[count].number[0]!=’\0’)
{
printf(“请输入名:\n”);
s_gets(n[count].k.name, MAX);
printf(“请输入中间名,如果没有直接按回车键.\n”);
s_gets(n[count].k.zname,2);
printf(“请输入姓:\n”);
s_gets(n[count++].k.sname,MAX);
if(count<SZ)
printf(“输入下一个社保号。\n”);
index++;

}
handle_sname(d);
for(count=0;count<index;count++)
{
if(n[count].k.zname[0]!=’\0’)

  printf("%s,%s %s -- %s\n",n[count].k.name,n[count].k.sname,
     n[count].k.zname,n[count].number);
else
    printf("%s,%s -- %s\n",n[count].k.name,n[count].k.sname,
           n[count].number);

}

return 0;
}

void handle_sname(struct card *names)
{
int i;
for(i=0;i<SZ;i++)
if(names->k.zname[0]!=’\0’)
{
names->k.zname[1]=’.’;
names->k.zname[2]=’\0’;
names++;
}

}

char *s_gets(char *st, int n)
{
char *ret_val;
char *find;

ret_val=fgets(st,n,stdin);
if(ret_val)
{
find=strchr(st,’\n’);
if(find)
*find=’\0’;
else
while(getchar()!=’\n’)
continue;
}
return ret_val;
}

//程序b.
#include <stdio.h>
#include <string.h>
#define MAX 20
#define SZ 5
#define K 3
struct fname{
char name[MAX];
char zname[K];
char sname[MAX];
};

struct card{
char number[MAX];
struct fname k;
};
char *s_gets(char *st,int n);

//把结构fname类里的成员 zname[0]的值传递给函数,返回一个fname类结构
struct fname handle_sname(char n);

int main(void)
{
struct card n[SZ];
struct card a;
int count=0;
int index=0;
int i;

printf(“请输入社保号。\n”);
printf(“按回车键结束。\n”);
while(count<5 && s_gets(n[count].number, MAX)!=NULL
&& n[count].number[0]!=’\0’)
{
printf(“请输入名:\n”);
s_gets(n[count].k.name, MAX);
printf(“请输入中间名,如果没有直接按回车键.\n”);
s_gets(n[count].k.zname,2);
printf(“请输入姓:\n”);
s_gets(n[count++].k.sname,MAX);
if(count<SZ)
printf(“输入下一个社保号。\n”);
index++;

}
for(count=0;count<index;count++)
{
if(n[count].k.zname[0]!=’\0’)
{
//调用函数,修改代表中间名的结构成员的值
a.k=handle_sname(n[count].k.zname[0]);
for(i=0;i<K;i++)
n[count].k.zname[i]=a.k.zname[i];

    printf("%s,%s %s -- %s\n",n[count].k.name,n[count].k.sname,
          n[count].k.zname, n[count].number);
}
else
    printf("%s,%s -- %s\n",n[count].k.name,n[count].k.sname,
           n[count].number);

}

return 0;
}
struct fname handle_sname(char n)
{
struct fname sk;
sk.zname[0]=n;
sk.zname[1]=’.’;
sk.zname[2]=’\0’;

return sk;
}

char *s_gets(char *st, int n)
{
char *ret_val;
char *find;

ret_val=fgets(st,n,stdin);
if(ret_val)
{
find=strchr(st,’\n’);
if(find)
*find=’\0’;
else
while(getchar()!=’\n’)
continue;
}
return ret_val;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值