鱼C论坛

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

鲁棒性

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

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

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

x
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时给出提示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

首先,需要引入正则表达式相关的头文件:
#include <regex.h>
然后,在`AddPlayer`函数中增加一个正则表达式的验证函数:
int validateID(const char* id) {    // 定义正则表达式的模式    const char* pattern = "^P[0-9]{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 100typedef struct Player {    char id[5];    char name[20];    char identity[20];    char rank[20];    char score[20];} Player;void SavePlayer(Player player, int num_players) {    // 保存棋手信息到文件    // ...}int validateID(const char* id) {    // 定义正则表达式的模式    const char* pattern = "^P[0-9]{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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 03:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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