C++学生管理系统用strstr实现模糊查找,发现只找到一个学生的信息?

C++学生管理系统用strstr()函数实现模糊查找,发现只找到一个学生的信息。

strstr()函数的定义:

char *strstr(const char *haystack, const char *needle)

我写的模糊查询代码:

img

我定义的所有的学生信息(5位学生姓名中都有“一”):

img

学生结构体:

img

输入“一”查找的结果:

img

只找到一个学生的信息,且五行都输出同一个学生的信息,请问是为什么?要怎么才能实现模糊查询呢?

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;
    
}

img

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7405475
  • 这篇博客你也可以参考下:不使用C/C++库函数,实现strstr函数功能
  • 除此之外, 这篇博客: strstr函数的原理原来是这样的中的 一、strstr函数是什么? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • strstr函数的功能是判断字符串二(str2)中是否含有字符串一(str1),如果是,则返回结果为str1中首次出现str2的位置的指针;如果否,则返回结果为空指针。

  • 以下回答由chatgpt基于相关博客总结生成:

    针对该问题,可以采用以下两种优化方法:

    1. 定义一个vector来存储所有查找到的学生信息

    2. 设置一个结构体数组存储学生信息 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}};

    3. 使用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中,方便后续的处理和输出,而不仅仅是找到一个学生的信息。

    4. 使用正则表达式库regex

    正则表达式是一种强大的字符串处理工具,C++中的regex库可以使用正则表达式实现比strstr()函数更为精确、全面的模糊查找。

    • 引入regex库 #include <regex>

    • 定义一个正则表达式对象,用于处理查找关键字 regex pat(key);

    • 在for循环中使用regex_search()函数进行模糊查找 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容器和正则表达式库进行优化。