2301_80691514 2024-05-23 15:25 采纳率: 87.1%
浏览 2

为什么程序会出现没有输入过的字符


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STUDENT_NUM 100

// 学生信息结构体
typedef struct {
    char id[10]; // 学号
    char name[20]; // 姓名
    char gender; // 性别
    int age; // 年龄
    float score; // 成绩
} Student;

Student students[MAX_STUDENT_NUM]; // 学生信息数组
int student_count = 0; // 学生数量

// 添加学生信息
void add_student() {
    if (student_count >= MAX_STUDENT_NUM) {
        printf("已达到最大学生数,无法添加新学生。\n");
        return;
    }
    Student student;
    printf("请输入学号:");
    scanf("%9s", student.id);
    printf("请输入姓名:");
    scanf("%19s", student.name);
    printf("请输入性别:");
    getchar();
    scanf("%c", &student.gender);
    printf("请输入年龄:");
    getchar();
    scanf("%d", &student.age);
    printf("请输入成绩:");
    scanf("%f", &student.score);
    students[student_count++] = student;
    printf("添加成功!\n");
}

// 显示所有学生信息
void show_all_students() {
    if (student_count == 0) {
        printf("暂无学生信息。\n");
        return;
    }
    printf("所有学生信息如下:\n");
    printf("学号\t姓名\t性别\t年龄\t成绩\n");
    for (int i = 0; i < student_count; i++) {
        printf("%s\t%s\t%c\t%d\t%.2f\n", students[i].id, students[i].name, students[i].gender, students[i].age, students[i].score);
    }
}

// 查找指定学号的学生信息
void search_student() {
    char id[10];
    printf("请输入要查找的学号:");
    scanf("%s", id);
    for (int i = 0; i < student_count; i++) {
        if (strcmp(students[i].id, id) == 0) {
            printf("找到该学生,信息如下:\n");
            printf("学号\t姓名\t性别\t年龄\t成绩\n");
            printf("%s\t%s\t%c\t%d\t%.2f\n", students[i].id, students[i].name, students[i].gender, students[i].age, students[i].score);
            return;
        }
    }
    printf("未找到该学生。\n");
}

// 修改指定学号的学生信息
void modify_student() {
    char id[10];
    printf("请输入要修改的学号:");
    scanf("%s", id);
   
    for (int i = 0; i < student_count; i++) {
        if (strcmp(students[i].id, id) == 0) {
            Student student;
            printf("请输入新的姓名:");
            scanf("%s", student.name);
            printf("请输入新的性别:");
            getchar();
scanf("%c", &student.gender);
            printf("请输入新的年龄:");
            getchar();
            scanf("%d", &student.age);
            printf("请输入新的成绩:");
            scanf("%f", &student.score);
            students[i] = student;
            printf("修改成功!\n");
            return;
        }
    }
    printf("未找到该学生。\n");
}

// 删除指定学号的学生信息
void delete_student() {
    char id[10];
    printf("请输入要删除的学号:");
    scanf("%s", id);
    for (int i = 0; i < student_count; i++) {
        if (strcmp(students[i].id, id) == 0) {
            for (int j = i + 1; j < student_count; j++) {
                students[j - 1] = students[j];
            }
            student_count--;
            printf("删除成功!\n");
            return;
        }
    }
    printf("未找到该学生。\n");
}

int main() {
    int choice;
    while (1) {
        printf("\n---\n");
        printf("欢迎使用学生信息管理系统,请选择以下操作:\n");
        printf("1. 添加学生信息\n");
        printf("2. 显示所有学生信息\n");
        printf("3. 查找指定学号的学生信息\n");
        printf("4. 修改指定学号的学生信息\n");
        printf("5. 删除指定学号的学生信息\n");
        printf("0. 退出系统\n");
        printf("---------------------------------\n");
        printf("请选择操作:");
        scanf("%d", &choice);
        switch (choice)
        {
            case 1:
                add_student();
                break;
            case 2:
                show_all_students();
                break;
            case 3:
                search_student();
                break;
            case 4:
                modify_student();
                break;
            case 5:
                delete_student();
                printf("删除成功!\n");
                break;
            case 0:
                exit(0);
            default:
                printf("输入有误,请重新选择。\n");
                break;
        }
    }
}

img

  • 写回答

5条回答

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-23 15:25
    关注

    引自免费微信小程序:皆我百晓生

    在您提供的C语言代码中,出现没有输入过字符的情况可能是因为在读取用户输入时存在一些潜在的问题。具体来说,在modify_student()函数中,当用户尝试修改一个学生的信息时,可能会遇到意外的字符输入。

    问题出在以下几个地方:

    1. 当用户输入新的姓名时,scanf("%s", student.name); 可能会读取到多余的空格,这可能导致后续的输入不正确。
    2. 在读取性别时,getchar(); 被用来清除前一个输入的换行符,但紧接着的 scanf("%c", &student.gender); 仍然可能读取到这个换行符作为输入,导致性别字段被赋值为换行符而非预期的字符。

    为了解决这个问题,我们可以调整代码,确保每次读取字符串或字符后都清除缓冲区中的多余字符。这里是一个修正后的modify_student()函数示例:

    void modify_student() {
        char id[10];
        printf("请输入要修改的学号:");
        scanf("%s", id);
    
        for (int i = 0; i < student_count; i++) {
            if (strcmp(students[i].id, id) == 0) {
                Student student;
                printf("请输入新的姓名:");
                fgets(student.name, sizeof(student.name), stdin);
                student.name[strcspn(student.name, "\n")] = '\0'; // 去除末尾换行符
    
                // 读取性别时,先读一行然后获取第一个字符
                getchar(); // 忽略之前的换行符
                fgets(student.gender, sizeof(student.gender), stdin);
                student.gender[0] = toupper(student.gender[0]); // 转换为大写并去除其他字符
                student.gender[1] = '\0';
    
                printf("请输入新的年龄:");
                getchar();
                scanf("%d", &student.age);
                printf("请输入新的成绩:");
                getchar();
                scanf("%f", &student.score);
    
                students[i] = student;
                printf("修改成功!\n");
                return;
            }
        }
        printf("未找到该学生。\n");
    }
    

    在这个版本中,我们使用了 fgets() 函数来读取用户的输入,而不是 scanf(),因为 fgets() 会读取直到换行符或达到指定长度为止,包括换行符。然后,我们通过 strcspn() 函数移除姓名字符串的末尾换行符,并对性别字段进行特殊处理,只保留第一个字符且转换为大写。

    这样应该可以解决没有输入过字符的问题。但是,请注意,这个修复仅针对modify_student()函数中的问题。如果在其他地方也存在类似问题,你需要按照同样的方法进行修正。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月23日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 Ubuntu20.04无法连接GitHub
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥30 C++行情软件的tick数据如何高效的合成K线