为什么void enter() { int i; for(i=0;i<STUDENT_NUM;i++) { if(student[i].no==-1) { break; } } if(i==STUDENT_NUM) { printf("存储已满\n"); } struct Student temp; printf("\n请输入学号:"); scanf("%d",&temp.no); printf("\n请输入姓名:"); getchar(); scanf("%s",&temp.name); printf("\n请输入年龄:"); getchar(); scanf("%d",&temp.age); printf("\n请输入性别:"); scanf("%s",&temp.sex); printf("\n请输入班级:"); getchar(); scanf("%d",&temp.c1ass); printf("\n请输入宿舍:"); getchar(); scanf("%s",&temp.address); printf("\n请输入电话:"); getchar(); scanf("%s",&temp.phone); for(int j=0;j<STUDENT_NUM;j++) { if(student[j].no==temp.no) { printf("\n学生已被录入,请勿重复输入\n"); } } student[i]=temp;输入的中文,在用printf输出的时候会变成乱码?
时间: 2024-04-05 18:30:07 浏览: 13
这是因为中文字符在计算机中是以Unicode编码形式存储的,而printf函数默认使用的是ASCII编码输出,这会导致中文字符被错误地解析和显示。解决方法可以使用支持Unicode编码输出的函数,比如wprintf函数,或者在输出中文字符前,先设置输出编码为UTF-8或者GBK等支持中文字符的编码方式。
相关问题
void enter() { int i; for(i=0;i<STUDENT_NUM;i++) { if(student[i].no==-1) { break; } } if(i==STUDENT_NUM) { printf("存储已满\n"); } struct Student temp; printf("\n请输入学号:"); scanf("%d",&temp.no); printf("\n请输入姓名:"); getchar(); scanf("%s",&temp.name); printf("\n请输入年龄:"); getchar(); scanf("%d",&temp.age); printf("\n请输入性别:"); scanf("%s",&temp.sex); printf("\n请输入班级:"); getchar(); scanf("%d",&temp.c1ass); printf("\n请输入宿舍:"); getchar(); scanf("%s",&temp.address); printf("\n请输入电话:"); getchar(); scanf("%s",&temp.phone); for(int j=0;j<STUDENT_NUM;j++) { if(student[j].no==temp.no) { printf("\n学生已被录入,请勿重复输入\n"); } } student[i]=temp; } void look() { int i; printf("\n学号 姓名 年龄 性别 班级 宿舍 电话号码\n"); for(i=0;i<STUDENT_NUM;i++) { if(student[i].no!=-1) { printf("%-4d%-4s%-4d%-3s%-4d%-5s%s\n",student[i].no,student[i].name,student[i].age,student[i].sex,student[i].c1ass,student[i].address,student[i].phone); } } printf("\n返回菜单\n"); }中,通过scanf输入的中文在printf输出之后为什么是乱码
C语言中,scanf函数默认使用空格作为输入数据的分隔符,而中文中的空格是全角空格,与英文的半角空格不同,因此在输入中文时,需要使用特殊的格式化字符"%[^\n]"来读取整行输入,防止读取到换行符之前的空格,从而导致乱码问题。
修改代码如下:
```
printf("\n请输入姓名:");
getchar();
scanf("%[^\n]",temp.name); //使用特殊的格式化字符"%[^\n]"来读取整行输入
printf("\n请输入性别:");
scanf("%[^\n]",temp.sex);
printf("\n请输入宿舍:");
scanf("%[^\n]",temp.address);
printf("\n请输入电话:");
scanf("%[^\n]",temp.phone);
```
功能4:该函数实现的是对已经存在于系统种的同学的信息进行删除操作,具体想法是学生人数num--,后面所有人的信息前移一个位置,实现信息的覆盖*/ void Delete() { int i, j,flag = -1; char op[2],information[maxsize]; setInfo("请输入:<1>按学号删除<2>按姓名删除", op); if (op[0] == '1') { setInfo("请输入学号", information); for (i = 0; i < num; i++) { if (strcmp(Students[i].Student_ID, information) == 0) { flag = 1; for (j = i + 1; j < num; j++) { copy(&Students[i], &Students[j]); } } } } else { setInfo("请输入姓名", information); for (i = 0; i < num; i++) { if (strcmp(Students[i].Name, information) == 0) { flag = 1; for (j = i + 1; j < num; j++) { copy(&Students[i], &Students[j]); } } } } if (flag == -1) { printf("查无此信息!按回车键返回\n"); wait_for_Enter(); return ; } num--;//数据减少,容量相应减少 printf("删除完成!按回车键返回\n"); wait_for_Enter(); } 请完善此删除功能,其查找学生姓名准备进行删除功能时,可以查找重名的情况,如果重名,则输入学号进一步确认,又因为每一位同学的数据不唯一,请精确删除范围,使其能删除同学某一天的考勤信息
好的,我来为您完善这个删除功能。首先,在查找到同名学生时,我们需要输出所有同名学生的信息,让用户选择要删除哪个学生。其次,在删除某个学生时,我们需要把这个学生的考勤信息也一并删除。以下是完善后的代码:
```
void Delete() {
int i, j, flag = -1;
char op[2], information[maxsize];
setInfo("请输入:<1>按学号删除<2>按姓名删除", op);
if (op[0] == '1') {
setInfo("请输入学号", information);
for (i = 0; i < num; i++) {
if (strcmp(Students[i].Student_ID, information) == 0) {
flag = 1;
for (j = i + 1; j < num; j++) {
copy(&Students[i], &Students[j]);
}
}
}
} else {
setInfo("请输入姓名", information);
for (i = 0; i < num; i++) {
if (strcmp(Students[i].Name, information) == 0) {
flag = 1;
int cnt = 0;
int indices[maxsize];
for (j = 0; j < num; j++) {
if (strcmp(Students[j].Name, information) == 0) {
printf("第%d位同名学生:\n", cnt + 1);
print(&Students[j]);
indices[cnt] = j;
cnt++;
}
}
if (cnt == 0) {
printf("查无此信息!按回车键返回\n");
wait_for_Enter();
return ;
}
setInfo("请选择要删除的同名学生(输入编号)", information);
int index = atoi(information);
if (index < 1 || index > cnt) {
printf("输入有误!按回车键返回\n");
wait_for_Enter();
return ;
}
i = indices[index - 1];
for (j = i + 1; j < num; j++) {
copy(&Students[i], &Students[j]);
}
}
}
}
if (flag == -1) {
printf("查无此信息!按回车键返回\n");
wait_for_Enter();
return ;
}
num--; // 数据减少,容量相应减少
// 删除该学生的考勤信息
for (i = 0; i < attendance_num; i++) {
if (strcmp(Attendance[i].Student_ID, Students[num].Student_ID) == 0) {
for (j = i + 1; j < attendance_num; j++) {
copy_attendance(&Attendance[i], &Attendance[j]);
}
attendance_num--;
}
}
printf("删除完成!按回车键返回\n");
wait_for_Enter();
}
```
在删除同名学生时,我们首先统计同名学生的数量,并输出所有同名学生的信息。然后,我们让用户输入要删除的同名学生的编号,再找到该学生的位置进行删除。在删除同学时,我们还需要遍历考勤信息表,把该学生的考勤信息也一并删除。