鱼C论坛

 找回密码
 立即注册
查看: 516|回复: 1

鲁棒性

[复制链接]
发表于 2023-12-21 09:03:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. void AddPlayer(Player players[], int* num_players)
  2. {
  3.         if(*num_players > MAX_PLAYERS)
  4.         {
  5.                 printf("棋手信息数量已达最大,无法继续添加!\n");
  6.                 return;
  7.         }
  8.         printf("请输入棋手的ID(大写英文字母 P 加 3 位正整数):");
  9.         scanf("%s", players[*num_players].id);
  10.         printf("请输入棋手姓名:");
  11.         scanf("%s", players[*num_players].name);
  12.         printf("请输入棋手身份:");
  13.         scanf("%s", players[*num_players].identity);
  14.         printf("请输入棋手段位:");
  15.         scanf("%s", players[*num_players].rank);
  16.         printf("请输入棋手等级分:");
  17.         scanf("%s", players[*num_players].score);
  18.                         
  19.         (*num_players)++;
  20.                         
  21.         printf("棋手信息添加成功!\n");
  22.                 SavePlayer(players, *num_players);
  23.                                 printf("本地文件更新成功\n");
  24. }
复制代码


修改这段代码,使得当用户输入格式不符合要求的ID时给出提示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-21 09:03:55 | 显示全部楼层
要添加对用户输入ID格式的判断,可以使用正则表达式。

首先,需要引入正则表达式相关的头文件:
  1. #include <regex.h>
复制代码

然后,在`AddPlayer`函数中增加一个正则表达式的验证函数:
  1. int validateID(const char* id) {
  2.     // 定义正则表达式的模式
  3.     const char* pattern = "^P[0-9]{3}$";
  4.     regex_t reg;
  5.     int ret;
  6.     // 编译正则表达式
  7.     if (regcomp(&reg, pattern, REG_EXTENDED|REG_NOSUB) != 0) {
  8.         printf("正则表达式编译失败!\n");
  9.         return 0;
  10.     }
  11.     // 执行正则表达式匹配
  12.     ret = regexec(&reg, id, 0, NULL, 0);
  13.     // 释放正则表达式
  14.     regfree(&reg);
  15.     return (ret == 0);
  16. }
复制代码

在`AddPlayer`函数中,在调用`scanf`函数之前,先进行ID格式的验证:
  1. printf("请输入棋手的ID(大写英文字母 P 加 3 位正整数):");
  2. scanf("%s", players.id);
  3. // 验证ID格式是否正确
  4. if (!validateID(players.id)) {
  5.     printf("ID格式不正确,请重新输入!\n");
  6.     return;
  7. }
复制代码

这样,当用户输入的ID格式不符合要求时,程序会给出提示,并终止继续执行。完整代码如下所示:
  1. #include <stdio.h>
  2. #include <regex.h>
  3. #define MAX_PLAYERS 100
  4. typedef struct Player {
  5.     char id[5];
  6.     char name[20];
  7.     char identity[20];
  8.     char rank[20];
  9.     char score[20];
  10. } Player;
  11. void SavePlayer(Player player, int num_players) {
  12.     // 保存棋手信息到文件
  13.     // ...
  14. }
  15. int validateID(const char* id) {
  16.     // 定义正则表达式的模式
  17.     const char* pattern = "^P[0-9]{3}$";
  18.     regex_t reg;
  19.     int ret;
  20.     // 编译正则表达式
  21.     if (regcomp(&reg, pattern, REG_EXTENDED|REG_NOSUB) != 0) {
  22.         printf("正则表达式编译失败!\n");
  23.         return 0;
  24.     }
  25.     // 执行正则表达式匹配
  26.     ret = regexec(&reg, id, 0, NULL, 0);
  27.     // 释放正则表达式
  28.     regfree(&reg);
  29.     return (ret == 0);
  30. }
  31. void AddPlayer(Player players, int* num_players) {
  32.     if(*num_players > MAX_PLAYERS) {
  33.         printf("棋手信息数量已达最大,无法继续添加!\n");
  34.         return;
  35.     }
  36.     printf("请输入棋手的ID(大写英文字母 P 加 3 位正整数):");
  37.     scanf("%s", players.id);
  38.     // 验证ID格式是否正确
  39.     if (!validateID(players.id)) {
  40.         printf("ID格式不正确,请重新输入!\n");
  41.         return;
  42.     }
  43.     printf("请输入棋手姓名:");
  44.     scanf("%s", players.name);
  45.     printf("请输入棋手身份:");
  46.     scanf("%s", players.identity);
  47.     printf("请输入棋手段位:");
  48.     scanf("%s", players.rank);
  49.     printf("请输入棋手等级分:");
  50.     scanf("%s", players.score);
  51.     (*num_players)++;
  52.     printf("棋手信息添加成功!\n");
  53.     SavePlayer(players, *num_players);
  54.     printf("本地文件更新成功\n");
  55. }
  56. int main() {
  57.     Player players;
  58.     int num_players = 0;
  59.     AddPlayer(players, &num_players);
  60.     return 0;
  61. }
复制代码

注意:这里只是简单使用正则表达式进行ID格式的验证,可能存在一些特殊情况未考虑到,更严格的ID验证可以使用其他方式实现。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-27 00:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表