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