C程序 查找姓名首字母

  • Post category:C

我将为您提供详细的使用攻略,以实现 C 程序中查找姓名首字母的功能。

常规需求

在许多应用场景中,我们都需要根据名字的首字母进行查找,比如通讯录、音乐播放器等。下面是一个基于 C 语言实现的例子程序。

#include <stdio.h>
#include <string.h>

/* 定义人员信息结构体 */
struct Person {
  char name[20];
  int age;
};

int main() {
  /* 初始化人员信息 */
  struct Person peoples[] = {
    {"张三", 18},
    {"李四", 20},
    {"王五", 22},
    {"赵六", 24},
    {"钱七", 26},
    {"孙八", 28},
  };
  /* 存储符合条件的人员信息 */
  struct Person results[10];
  int count = 0;
  /* 输入首字母 */
  char ch;
  printf("请输入姓名首字母:");
  scanf("%c", &ch);
  /* 遍历数组,查找符合条件的人员信息 */
  for (int i = 0; i < sizeof(peoples) / sizeof(struct Person); i++) {
    if (peoples[i].name[0] == ch) {
      results[count++] = peoples[i];
    }
  }
  /* 输出结果 */
  if (count > 0) {
    printf("以下人员名字以 %c 开头:\n", ch);
    for (int i = 0; i < count; i++) {
      printf("%s,年龄:%d\n", results[i].name, results[i].age);
    }
  } else {
    printf("没有符合条件的人员信息!\n");
  }
  return 0;
}

通过上述代码,我们可以实现通过姓名首字母查找人员信息的功能。具体实现步骤如下:

  1. 定义人员信息结构体。
  2. 初始化人员信息数组。
  3. 输入要查找的首字母。
  4. 遍历人员信息数组,查找符合条件的人员信息。
  5. 将符合条件的人员信息存储到新的结果数组中。
  6. 输出结果。

进阶需求

除了基本的姓名首字母查找功能外,我们还可以进行一些进阶的需求,比如模糊匹配、自动补全等。

模糊匹配

在实际应用中,有时候用户可能输入的并不是完全匹配的首字母,而是一个字母的拼音首字母或其他可能的变体。这时候就需要进行模糊匹配了。

下面是一个模糊匹配的例子程序:

#include <stdio.h>
#include <string.h>

/* 定义人员信息结构体 */
struct Person {
  char name[20];
  int age;
};

/* 判断是否匹配 */
int isMatch(char* str, char ch) {
  char initials[] = "bcdfghjklmnpqrstvwxyz";
  for (int i = 0; i < strlen(initials); i++) {
    if (initials[i] == ch && str[0] == (char) i + 'a') {
      return 1;
    }
  }
  return 0;
}

int main() {
  /* 初始化人员信息 */
  struct Person peoples[] = {
    {"张山", 18},
    {"李四", 20},
    {"王无", 22},
    {"赵大", 24},
    {"钱比", 26},
    {"孙八", 28},
  };
  /* 存储符合条件的人员信息 */
  struct Person results[10];
  int count = 0;
  /* 输入要查找的首字母 */
  char ch;
  printf("请输入姓名首字母:");
  scanf("%c", &ch);
  /* 遍历数组,查找符合条件的人员信息 */
  for (int i = 0; i < sizeof(peoples) / sizeof(struct Person); i++) {
    if (isMatch(peoples[i].name, ch)) {
      results[count++] = peoples[i];
    }
  }
  /* 输出结果 */
  if (count > 0) {
    printf("以下人员名字与 %c 匹配:\n", ch);
    for (int i = 0; i < count; i++) {
      printf("%s,年龄:%d\n", results[i].name, results[i].age);
    }
  } else {
    printf("没有匹配的人员信息!\n");
  }
  return 0;
}

在上述代码中,我们首先定义了一个 isMatch 方法,用于判断某个字符串是否与给定的字符相匹配。具体实现步骤如下:

  1. 定义一个 initials 数组,用于存储所有可能的首字母。
  2. 遍历 initials 数组,判断当前字符是否与给定的字符相同。
  3. 如果相同,则将当前字符串的第一个字符转换为对应的字母,判断是否匹配。

自动补全

在用户输入过程中,我们可以提供自动补全的功能,帮助用户快速、准确地完成输入。下面是一个自动补全的例子程序:

#include <stdio.h>
#include <string.h>

/* 定义人员信息结构体 */
struct Person {
  char name[20];
  int age;
};

/* 自动补全 */
void autoComplete(char* input, char* output) {
  char initials[] = "bcdfghjklmnpqrstvwxyz";
  for (int i = 0; i < strlen(initials); i++) {
    if (initials[i] == input[0]) {
      output[0] = (char) i + 'a';
      output[1] = '\0';
      break;
    }
  }
}

int main() {
  /* 初始化人员信息 */
  struct Person peoples[] = {
    {"张山", 18},
    {"李四", 20},
    {"王无", 22},
    {"赵大", 24},
    {"钱比", 26},
    {"孙八", 28},
  };
  /* 存储符合条件的人员信息 */
  struct Person results[10];
  int count = 0;
  /* 输入要查找的首字母 */
  char input[20];
  char ch[2];  // 自动补全结果
  printf("请输入姓名:");
  scanf("%s", input);
  autoComplete(input, ch);
  printf("%s -> %s\n", input, ch);
  /* 遍历数组,查找符合条件的人员信息 */
  for (int i = 0; i < sizeof(peoples) / sizeof(struct Person); i++) {
    if (strncmp(peoples[i].name, ch, strlen(ch)) == 0) {
      results[count++] = peoples[i];
    }
  }
  /* 输出结果 */
  if (count > 0) {
    printf("以下人员名字与 %s 匹配:\n", ch);
    for (int i = 0; i < count; i++) {
      printf("%s,年龄:%d\n", results[i].name, results[i].age);
    }
  } else {
    printf("没有匹配的人员信息!\n");
  }
  return 0;
}

在上述代码中,我们首先定义了一个 autoComplete 方法,用于自动补全字符串。具体实现步骤如下:

  1. 定义一个 initials 数组,用于存储所有可能的首字母。
  2. 遍历 initials 数组,判断当前字符是否与输入字符串的首字符相同。
  3. 如果相同,则将对应的字母保存到输出字符串中。
  4. 使用 strncmp 函数进行字符串匹配,查找符合条件的人员信息。

通过上述示例,我们可以实现比较实用的姓名首字母查找功能,并能够应对模糊匹配、自动补全等多种需求。