小羊爱吃小草 发表于 2023-12-21 09:03:40

鲁棒性

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时给出提示

FishC 发表于 2023-12-21 09:03:55

要添加对用户输入ID格式的判断,可以使用正则表达式。

首先,需要引入正则表达式相关的头文件:

#include <regex.h>

然后,在`AddPlayer`函数中增加一个正则表达式的验证函数:

int validateID(const char* id) {
    // 定义正则表达式的模式
    const char* pattern = "^P{3}$";

    regex_t reg;
    int ret;

    // 编译正则表达式
    if (regcomp(&reg, pattern, REG_EXTENDED|REG_NOSUB) != 0) {
      printf("正则表达式编译失败!\n");
      return 0;
    }

    // 执行正则表达式匹配
    ret = regexec(&reg, id, 0, NULL, 0);

    // 释放正则表达式
    regfree(&reg);

    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(&reg, pattern, REG_EXTENDED|REG_NOSUB) != 0) {
      printf("正则表达式编译失败!\n");
      return 0;
    }

    // 执行正则表达式匹配
    ret = regexec(&reg, id, 0, NULL, 0);

    // 释放正则表达式
    regfree(&reg);

    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]
查看完整版本: 鲁棒性