让以下程序中,”姓名“这一数据只能输入汉字,输入其它字符会提示错误并让重新输入,这该如何解决
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
typedef struct student
{ char qinshi[15];
char chuangwei[10];
char name[20];
char phone[12];
long num;
}STU;
void shuru()
{ int i,n;
STU a;
FILE *fp;
fp=fopen("D:\\学生宿舍系统.dat","wb");
if(fp==NULL)
{ printf("!");return;}
system("cls");
printf("录入的个数是: ");
scanf("%d",&n);
for(i=0;i<n;i++)
{ printf("\t寝室号:");
scanf("%s",&a.qinshi);
printf("\t床 位:");
scanf("%s",&a.chuangwei);
printf("\t姓 名:");
scanf("%s",a.name);
printf("\t手机号:");
scanf("%s",a.phone);
printf("\t学 号:");
scanf("%ld",&a.num);
fwrite(&a,sizeof(STU),1,fp);
}
fclose(fp);
}
void zhuijia()
{
int i,n;
STU a;
FILE *fp;
system("cls");
if((fp=fopen("D:\\学生宿舍系统.dat","ab"))==NULL)
{printf("error!\n");exit(0);}
printf("\n\n\t请输入追加人数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("\t寝室号:");
scanf("%s",&a.qinshi);
printf("\t床位:");
scanf("%s",&a.chuangwei);
printf("\t姓名:");
scanf("%s",a.name);
printf("\t手机号:");
scanf("%s",a.phone);
printf("\t学号:");
scanf("%ld",&a.num);
fwrite(&a,sizeof(STU),1,fp);
}
fclose(fp);
}
void xianshi()
{STU a;
FILE*fp;
system("cls");
if((fp=fopen("D:\\学生宿舍系统.dat","rb"))==NULL)
{printf("error!\n");exit(0);}
rewind(fp);
printf("寝室号\t床位\t姓名\t手机号 \t学号\n");
while(fread(&a,sizeof(STU),1,fp)!=0)
printf("%s\t%s\t%s\t%s\t%ld\n",a.qinshi,a.chuangwei,a.name,a.phone,a.num);
fclose(fp);
}
void chaxunbyname()
{
int f=0;
char na[20];
STU a;
FILE *fp;
fp=fopen("D:\\学生宿舍系统.dat","rb");
if(fp==NULL)
{printf("无法打开!\n");exit(1);}
printf("请输入要查找姓名:");
scanf("%s",na);
while(fread(&a,sizeof(STU),1,fp)!=0)
if(strcmp(na,a.name)==0)
{
printf("寝室号\t床位\t姓名\t手机号 \t学号\n");
printf("%s\t%s\t%s\t%s\t%ld\n",a.qinshi,a.chuangwei,a.name,a.phone,a.num);
f=1;
}
if(f==0) printf("没有该学生信息。\n");
fclose(fp);
}
void chaxunbyxuehao()
{ int f=0,x;
STU a;
FILE *fp;
fp=fopen("D:\\学生宿舍系统.dat","rb");
if(fp==NULL)
{printf("打开失败!\n");exit(1);}
printf("请输入要查询的 ");
scanf("%d",&x);
while(fread(&a,sizeof(STU),1,fp)!=0)
if(x==a.num)
{
printf("寝室号\t床位\t姓名\t手机号 \t学号\n");
printf("%s\t%s\t%s\t%s\t%ld\n",a.qinshi,a.chuangwei,a.name,a.phone,a.num);
f=1;
}
if(f==0) printf("没有该学生信息。\n");
fclose(fp);
}
void chaxun()
{ int a;
system("cls");
printf("\n\n\t\t你现在已经进入学生宿舍管理系统\n");
printf("\t\t\t按姓名查询输入1\n");
printf("\t\t\t按学号查询输入2\n");
printf("\t\t\t退出输入3\n");
printf("\t\t\t请输入命令: ");
scanf("%d",&a);
switch(a)
{case 1:chaxunbyname();break;
case 2:chaxunbyxuehao();break;
case 3:break;
}
}
void shanchu()
{
struct student a[10];
int i=0, n, f=0, k;
long num;
FILE *fp;
system("cls");
{
fp=fopen("D:\\学生宿舍系统.dat","r");
if (fp==NULL)
{printf("打开D:\\学生宿舍系统.dat 失败!\n");
exit(1);
}
fseek(fp,0,2);
n=ftell(fp)/sizeof(struct student) ;
rewind(fp);
printf("输入学号:");
scanf("%ld",&num);
for(i=0;i<n;i++)
fread (&a[i], sizeof (STU) , 1, fp);
for(i=0;i<n;i++)
if (num==a[i].num)
{ printf("按任意键删除");
f=1;
k=1;
break;
}
else f=0;
fclose (fp);
if(f==0)
printf("未找到对应学生信息\n");
else
{
for(i=k;i<n-1;i++)
a[i]=a[i+1];
n--;
fp=fopen("D:\\学生宿舍系统.dat","w");
if (fp==NULL)
{ printf("打开D:\\学生宿舍系统.dat 失败!\n");
exit(1);
}
for (i=0;i<n;i++)
fwrite (&a[i], sizeof(struct student),1,fp);
fclose(fp);
}
getchar();getchar();
}
}
void xiugai()
{
long num;
int found = 0;
STU a;
FILE *fp;
system("cls");
fp = fopen("D:\\学生宿舍系统.dat", "r+");
if (fp == NULL)
{
printf("打开D:\\学生宿舍系统.dat失败!\n");
exit(1);
}
printf("请输入要修改学生的学号: ");
scanf("%ld", &num);
while (fread(&a, sizeof(STU), 1, fp) != 0)
{
if (num == a.num)
{
printf("找到学生信息,请输入要修改的信息:\n");
printf("\t寝室号: ");
scanf("%s", &a.qinshi);
printf("\t床位: ");
scanf("%s", &a.chuangwei);
printf("\t姓名: ");
scanf("%s", a.name);
printf("\t手机号: ");
scanf("%s", a.phone);
fseek(fp, -sizeof(STU), SEEK_CUR);
fwrite(&a, sizeof(STU), 1, fp);
found = 1;
break;
}
}
if (found == 0)
{
printf("未找到该学生信息。\n");
}
else
{
printf("学生信息已成功修改。\n");
}
fclose(fp);
}
int main()
{
int a;
do
{
printf("欢迎进入学生宿舍管理系统\n");
printf("录入学生信息输入1\n");
printf("显示学生信息信息输入2\n");
printf("查询学生信息输入3\n");
printf("追加学生信息输入4\n");
printf("删除学生信息输入5\n");
printf("修改学生信息输入6\n");
printf("退出系统输入7\n");
printf("输入命令: ");
scanf("%d",&a);
switch(a)
{
case 1:shuru();break;
case 2:xianshi();break;
case 3:chaxun();break;
case 4:zhuijia();break;
case 5:shanchu();break;
case 6:xiugai();break;
case 7:exit(0);
}
}while(a!=0);
return 0;
}
printf("\t姓 名:");
scanf("%s",a.name);
修改为
while (1)
{
printf("\t姓 名:");
scanf("%s",a.name);
for (int ii = 0; ii < a.name; ii++)
if (a.name[ii] <= 0x4E00 && a.name[ii] >= 0x9FA5)
goto repeat;
break;
repeat:
}
那么我哪一个没有动态分配内存的指针究竟指向了什么?
是随意指向成为了一个野指针吗?
还是指向了NULL(一般这个要设置才能默认指向NULL吧?)
求教。
这你得去查utf8的汉字编码范围,只有汉字编码范围内的值才不报错,其余都报错就好了!
这么改,改动处见注释,供参考:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
typedef struct student
{
char qinshi[15];
char chuangwei[10];
char name[20];
char phone[12];
long num;
}STU;
void shuru()
{
int i, n;
STU a;
FILE* fp;
fp = fopen("D:\\学生宿舍系统.dat", "wb");
if (fp == NULL)
{
printf("!"); return;
}
system("cls");
printf("录入的个数是: ");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("\t寝室号:");
scanf("%s", a.qinshi); //scanf("%s", &a.qinshi); 修改
printf("\t床 位:");
scanf("%s", a.chuangwei); //scanf("%s", &a.chuangwei); 修改
printf("\t姓 名:");
do { // 修改
getchar();
scanf("%s", a.name);
if (a.name[0] & 0x80)
break;
else
printf("\t姓名须中文名,请重新输入:");
} while (1); // 修改
printf("\t手机号:");
scanf("%s", a.phone);
printf("\t学 号:");
scanf("%ld", &a.num);
fwrite(&a, sizeof(STU), 1, fp);
}
fclose(fp);
}
void zhuijia()
{
int i, n;
STU a;
FILE* fp;
system("cls");
if ((fp = fopen("D:\\学生宿舍系统.dat", "ab")) == NULL)
{
printf("error!\n"); exit(0);
}
printf("\n\n\t请输入追加人数:");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("\t寝室号:");
scanf("%s", a.qinshi); //scanf("%s", &a.qinshi); 修改
printf("\t床位:");
scanf("%s", a.chuangwei); //scanf("%s", &a.chuangwei); 修改
printf("\t姓名:");
do { // 修改
getchar();
scanf("%s", a.name);
if (a.name[0] & 0x80)
break;
else
printf("\t姓名须中文名,请重新输入:");
} while (1); // 修改
printf("\t手机号:");
scanf("%s", a.phone);
printf("\t学号:");
scanf("%ld", &a.num);
fwrite(&a, sizeof(STU), 1, fp);
}
fclose(fp);
}
void xianshi()
{
STU a;
FILE* fp;
system("cls");
if ((fp = fopen("D:\\学生宿舍系统.dat", "rb")) == NULL)
{
printf("error!\n"); exit(0);
}
rewind(fp);
printf("寝室号\t床位\t姓名\t手机号 \t学号\n");
while (fread(&a, sizeof(STU), 1, fp) != 0)
printf("%s\t%s\t%s\t%s\t%ld\n", a.qinshi, a.chuangwei, a.name, a.phone, a.num);
fclose(fp);
}
void chaxunbyname()
{
int f = 0;
char na[20];
STU a;
FILE* fp;
fp = fopen("D:\\学生宿舍系统.dat", "rb");
if (fp == NULL)
{
printf("无法打开!\n"); exit(1);
}
printf("请输入要查找姓名:");
scanf("%s", na);
while (fread(&a, sizeof(STU), 1, fp) != 0)
if (strcmp(na, a.name) == 0)
{
printf("寝室号\t床位\t姓名\t手机号 \t学号\n");
printf("%s\t%s\t%s\t%s\t%ld\n", a.qinshi, a.chuangwei, a.name, a.phone, a.num);
f = 1;
}
if (f == 0) printf("没有该学生信息。\n");
fclose(fp);
}
void chaxunbyxuehao()
{
int f = 0, x;
STU a;
FILE* fp;
fp = fopen("D:\\学生宿舍系统.dat", "rb");
if (fp == NULL)
{
printf("打开失败!\n"); exit(1);
}
printf("请输入要查询的 ");
scanf("%d", &x);
while (fread(&a, sizeof(STU), 1, fp) != 0)
if (x == a.num)
{
printf("寝室号\t床位\t姓名\t手机号 \t学号\n");
printf("%s\t%s\t%s\t%s\t%ld\n", a.qinshi, a.chuangwei, a.name, a.phone, a.num);
f = 1;
}
if (f == 0) printf("没有该学生信息。\n");
fclose(fp);
}
void chaxun()
{
int a;
system("cls");
printf("\n\n\t\t你现在已经进入学生宿舍管理系统\n");
printf("\t\t\t按姓名查询输入1\n");
printf("\t\t\t按学号查询输入2\n");
printf("\t\t\t退出输入3\n");
printf("\t\t\t请输入命令: ");
scanf("%d", &a);
switch (a)
{
case 1:chaxunbyname(); break;
case 2:chaxunbyxuehao(); break;
case 3:break;
}
}
void shanchu()
{
struct student a[10];
int i = 0, n, f = 0, k;
long num;
FILE* fp;
system("cls");
{
fp = fopen("D:\\学生宿舍系统.dat", "r");
if (fp == NULL)
{
printf("打开D:\\学生宿舍系统.dat 失败!\n");
exit(1);
}
fseek(fp, 0, 2);
n = ftell(fp) / sizeof(struct student);
rewind(fp);
printf("输入学号:");
scanf("%ld", &num);
for (i = 0; i < n; i++)
fread(&a[i], sizeof(STU), 1, fp);
for (i = 0; i < n; i++)
if (num == a[i].num)
{
printf("按任意键删除");
f = 1;
k = 1;
break;
}
else f = 0;
fclose(fp);
if (f == 0)
printf("未找到对应学生信息\n");
else
{
for (i = k; i < n - 1; i++)
a[i] = a[i + 1];
n--;
fp = fopen("D:\\学生宿舍系统.dat", "w");
if (fp == NULL)
{
printf("打开D:\\学生宿舍系统.dat 失败!\n");
exit(1);
}
for (i = 0; i < n; i++)
fwrite(&a[i], sizeof(struct student), 1, fp);
fclose(fp);
}
getchar(); getchar();
}
}
void xiugai()
{
long num;
int found = 0;
STU a;
FILE* fp;
system("cls");
fp = fopen("D:\\学生宿舍系统.dat", "r+");
if (fp == NULL)
{
printf("打开D:\\学生宿舍系统.dat失败!\n");
exit(1);
}
printf("请输入要修改学生的学号: ");
scanf("%ld", &num);
while (fread(&a, sizeof(STU), 1, fp) != 0)
{
if (num == a.num)
{
printf("找到学生信息,请输入要修改的信息:\n");
printf("\t寝室号: ");
scanf("%s", &a.qinshi);
printf("\t床位: ");
scanf("%s", &a.chuangwei);
printf("\t姓名: ");
scanf("%s", a.name);
printf("\t手机号: ");
scanf("%s", a.phone);
fseek(fp, -sizeof(STU), SEEK_CUR);
fwrite(&a, sizeof(STU), 1, fp);
found = 1;
break;
}
}
if (found == 0)
{
printf("未找到该学生信息。\n");
}
else
{
printf("学生信息已成功修改。\n");
}
fclose(fp);
}
int main()
{
int a;
do
{
printf("欢迎进入学生宿舍管理系统\n");
printf("录入学生信息输入1\n");
printf("显示学生信息信息输入2\n");
printf("查询学生信息输入3\n");
printf("追加学生信息输入4\n");
printf("删除学生信息输入5\n");
printf("修改学生信息输入6\n");
printf("退出系统输入7\n");
printf("输入命令: ");
scanf("%d", &a);
switch (a)
{
case 1:shuru(); break;
case 2:xianshi(); break;
case 3:chaxun(); break;
case 4:zhuijia(); break;
case 5:shanchu(); break;
case 6:xiugai(); break;
case 7:exit(0);
}
} while (a != 0);
return 0;
}