C++学生管理系统用strstr()函数实现模糊查找,发现只找到一个学生的信息。
strstr()函数的定义:
char *strstr(const char *haystack, const char *needle)
我写的模糊查询代码:
我定义的所有的学生信息(5位学生姓名中都有“一”):
学生结构体:
输入“一”查找的结果:
只找到一个学生的信息,且五行都输出同一个学生的信息,请问是为什么?要怎么才能实现模糊查询呢?
z=result-s[w].name这行不需要,然后后面一行直接打印下标w的结构元素信息即可,因为result!=nullptr,即表示当前姓名中包含字符串name1。
测试如下:
参考链接:
#include <iostream>
#include <string.h>
#include <stdlib.h>
#define max 50
#define student_number 5
using namespace std;
struct student{
char name[max];
char num[max];
char sex[max];
int age;
char hometown[max];
char major[max];
}s[5]={
{"张一三","202211701100","男",18,"广东省湛江市","软件工程"},
{"李一四","202211701101","男",17,"广东省广州市","计算科学"},
{"王一五","202211701102","女",17,"广东省深圳市","计算科学"},
{"赵一六","202211701103","男",19,"广东省茂名市","软件工程"},
{"孙一七","202211701104","女",18,"广东省河源市","软件工程"},
};
void search_by_name2(){
int w=0;
int z;
int x=student_number;
char name1[max];
system("cls");
cout<<"请输入查找的姓名:";
cin>>name1;
printf_table();
for(w=0;w<student_number;w++){
// https://www.runoob.com/cprogramming/c-function-strstr.html
// 寻找当前学生结构元素中的姓名字段中,第一次出现name1字符串的位置
char *result = strstr(s[w].name,name1);
// 如果找到,则打印对应学生信息
if(result!=nullptr){
// z=result-s[w].name;
// cout<<"| "<<s[z].name<<"| "<<s[z].num<<"| "<<s[z].sex<<"| "<<s[z].age<<"| "<<s[z].hometown<<"| "<<s[z].major<<endl;
cout<<"| "<<s[w].name<<" | "<<s[w].num<<" | "<<s[w].sex<<" | "<<s[w].age<<" | "<<s[w].hometown<<" | "<<s[w].major<<endl;
}
}
}
int main(void){
search_by_name2();
return 0;
}
strstr函数的功能是判断字符串二(str2)中是否含有字符串一(str1),如果是,则返回结果为str1中首次出现str2的位置的指针;如果否,则返回结果为空指针。
针对该问题,可以采用以下两种优化方法:
定义一个vector来存储所有查找到的学生信息
设置一个结构体数组存储学生信息 struct student{ string name; int age; int id; float gpa; }; student info[5]={{“Tom”,20,1001,3.2}, {“Harry”,21,1002,3.5}, {“Jerry”,19,1003,3.8}, {“Lucy”,20,1004,3.4}, {“Lily”,19,1005,3.9}};
使用vector来存储查找到的学生信息 vector<student> result; string key = "一"; for(int i=0;i<n;i++){ //使用find()函数代替strstr()函数,查找name中是否包含关键字 if(info[i].name.find(key)!=string::npos){ result.push_back(info[i]); } } cout<<"共有"<<result.size()<<"个学生信息"<<endl; for(int i=0;i<result.size();i++){ cout<<"姓名:"<<result[i].name<<endl; cout<<"年龄:"<<result[i].age<<endl; cout<<"学号:"<<result[i].id<<endl; cout<<"GPA:"<<result[i].gpa<<endl; }
这样可以将所有查找到的学生信息存储到vector中,方便后续的处理和输出,而不仅仅是找到一个学生的信息。
使用正则表达式库regex
正则表达式是一种强大的字符串处理工具,C++中的regex库可以使用正则表达式实现比strstr()函数更为精确、全面的模糊查找。
引入regex库 #include <regex>
定义一个正则表达式对象,用于处理查找关键字 regex pat(key);
for (int i = 0; i < n; ++i) { string s = info[i].name; if (regex_search(s, pat)) { cout << "姓名:" << info[i].name << endl; cout << "年龄:" << info[i].age << endl; cout << "学号:" << info[i].id << endl; cout << "GPA:" << info[i].gpa << endl; } }
总体来说,正则表达式的实现比较复杂,需要掌握正则表达式的语法和regex库相关函数的使用,在模糊查找中快速定位到关键字,然后通过正则表达式的匹配模式来找到所有符合条件的结果。提示:根据参考资料中给出的算法步骤,使用strstr函数进行模糊查找只能查找到第一个结果,因此需要在代码中进行修改和优化。同时,可考虑使用STL容器和正则表达式库进行优化。