c语言如何让显示的数据只能显示汉字,输入其它字符会报错

让以下程序中,”姓名“这一数据只能输入汉字,输入其它字符会提示错误并让重新输入,这该如何解决

#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:
}

这你得去查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;
}