编辑代码

#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
#include <stdbool.h>
#include <string.h>

typedef struct {
    wchar_t name[50];
    int number;
    int score;
} Student;

// 清除输入缓冲区中的剩余字符
void clear_input_buffer() {
    wchar_t c;
    while ((c = getwchar()) != L'\n' && c != WEOF);
}

// 验证学号和成绩是否有效
bool is_valid_number(int num) {
    return num > 0; // 学号必须为正数
}

bool is_valid_score(int score) {
    return score >= 0 && score <= 100; // 成绩在0-100之间
}

// 从字符串解析学生信息
bool parse_student(const wchar_t* line, Student* student) {
    int fields_read = swscanf(line, L"%49[^0-9] %d %d", 
                            student->name, 
                            &student->number, 
                            &student->score);

    if (fields_read != 3) {
        return false;
    }

    // 清理姓名末尾空格
    wchar_t *p = student->name;
    while (*p != L'\0') p++;
    while (p > student->name && *(p-1) == L' ') *(--p) = L'\0';

    return is_valid_number(student->number) && is_valid_score(student->score);
}

// 输入学生信息(支持多行粘贴)
void input_students(Student* students, int n) {
    setlocale(LC_ALL, ""); // 设置本地化以支持宽字符
    wprintf(L"请输入%d位学生的信息(姓名 学号 成绩),可以逐行输入或一次性粘贴多行:\n", n);

    wchar_t* buffer = NULL;
    size_t buffer_size = 0;
    int students_entered = 0;
    int line_number = 0;

    // 一次性读取所有输入
    while (students_entered < n) {
        line_number++;
        wprintf(L"输入第%d位学生(剩余%d位):", students_entered + 1, n - students_entered);
        
        ssize_t chars_read = getline(&buffer, &buffer_size, stdin);
        if (chars_read == -1) {
            perror("读取输入失败");
            break;
        }

        // 移除行末换行符
        if (chars_read > 0 && buffer[chars_read-1] == L'\n') {
            buffer[chars_read-1] = L'\0';
            chars_read--;
        }

        // 跳过空行
        if (chars_read == 0) {
            wprintf(L"忽略空行\n");
            continue;
        }

        // 尝试解析
        if (parse_student(buffer, &students[students_entered])) {
            students_entered++;
        } else {
            wprintf(L"第%d行格式错误!请使用格式:姓名 学号 成绩\n", line_number);
            wprintf(L"示例:张三 101 90\n");
        }
    }

    free(buffer); // 释放缓冲区

    // 如果粘贴的行数多于需要的学生数,提示忽略多余行
    if (students_entered == n) {
        wchar_t extra_line[256];
        if (fgetws(extra_line, sizeof(extra_line)/sizeof(wchar_t), stdin) != NULL) {
            wprintf(L"注意:已输入足够数量的学生信息,后续内容将被忽略\n");
            clear_input_buffer();
        }
    }
}

// 测试函数
int main() {
    const int num_students = 3;
    Student students[num_students];
    
    input_students(students, num_students);
    
    wprintf(L"\n成功输入的学生信息:\n");
    for (int i = 0; i < num_students; i++) {
        wprintf(L"%d. %ls\t%d\t%d\n", i+1, 
               students[i].name, 
               students[i].number, 
               students[i].score);
    }
    
    return 0;
}