鲁棒性
void AddPlayer(Player players[], int* num_players){
if(*num_players > MAX_PLAYERS)
{
printf("棋手信息数量已达最大,无法继续添加!\n");
return;
}
printf("请输入棋手的ID(大写英文字母 P 加 3 位正整数):");
scanf("%s", players[*num_players].id);
printf("请输入棋手姓名:");
scanf("%s", players[*num_players].name);
printf("请输入棋手身份:");
scanf("%s", players[*num_players].identity);
printf("请输入棋手段位:");
scanf("%s", players[*num_players].rank);
printf("请输入棋手等级分:");
scanf("%s", players[*num_players].score);
(*num_players)++;
printf("棋手信息添加成功!\n");
SavePlayer(players, *num_players);
printf("本地文件更新成功\n");
}
修改这段代码,使得当用户输入格式不符合要求的ID时给出提示 要添加对用户输入ID格式的判断,可以使用正则表达式。
首先,需要引入正则表达式相关的头文件:
#include <regex.h>
然后,在`AddPlayer`函数中增加一个正则表达式的验证函数:
int validateID(const char* id) {
// 定义正则表达式的模式
const char* pattern = "^P{3}$";
regex_t reg;
int ret;
// 编译正则表达式
if (regcomp(®, pattern, REG_EXTENDED|REG_NOSUB) != 0) {
printf("正则表达式编译失败!\n");
return 0;
}
// 执行正则表达式匹配
ret = regexec(®, id, 0, NULL, 0);
// 释放正则表达式
regfree(®);
return (ret == 0);
}
在`AddPlayer`函数中,在调用`scanf`函数之前,先进行ID格式的验证:
printf("请输入棋手的ID(大写英文字母 P 加 3 位正整数):");
scanf("%s", players.id);
// 验证ID格式是否正确
if (!validateID(players.id)) {
printf("ID格式不正确,请重新输入!\n");
return;
}
这样,当用户输入的ID格式不符合要求时,程序会给出提示,并终止继续执行。完整代码如下所示:
#include <stdio.h>
#include <regex.h>
#define MAX_PLAYERS 100
typedef struct Player {
char id;
char name;
char identity;
char rank;
char score;
} Player;
void SavePlayer(Player player, int num_players) {
// 保存棋手信息到文件
// ...
}
int validateID(const char* id) {
// 定义正则表达式的模式
const char* pattern = "^P{3}$";
regex_t reg;
int ret;
// 编译正则表达式
if (regcomp(®, pattern, REG_EXTENDED|REG_NOSUB) != 0) {
printf("正则表达式编译失败!\n");
return 0;
}
// 执行正则表达式匹配
ret = regexec(®, id, 0, NULL, 0);
// 释放正则表达式
regfree(®);
return (ret == 0);
}
void AddPlayer(Player players, int* num_players) {
if(*num_players > MAX_PLAYERS) {
printf("棋手信息数量已达最大,无法继续添加!\n");
return;
}
printf("请输入棋手的ID(大写英文字母 P 加 3 位正整数):");
scanf("%s", players.id);
// 验证ID格式是否正确
if (!validateID(players.id)) {
printf("ID格式不正确,请重新输入!\n");
return;
}
printf("请输入棋手姓名:");
scanf("%s", players.name);
printf("请输入棋手身份:");
scanf("%s", players.identity);
printf("请输入棋手段位:");
scanf("%s", players.rank);
printf("请输入棋手等级分:");
scanf("%s", players.score);
(*num_players)++;
printf("棋手信息添加成功!\n");
SavePlayer(players, *num_players);
printf("本地文件更新成功\n");
}
int main() {
Player players;
int num_players = 0;
AddPlayer(players, &num_players);
return 0;
}
注意:这里只是简单使用正则表达式进行ID格式的验证,可能存在一些特殊情况未考虑到,更严格的ID验证可以使用其他方式实现。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]