关于C/C++程序里如何实现模糊查找

    相信学过C/C++的都应该了解如何在数组里面去查找数据,利用for循环便能很容易实现查找的功能,但若数组里的数据是字符串类型,而你又恰好需要实现的是根据关键字进行查找的话,那么按部就班对数组里的字符串进行一个个字符的对比是很难实现的,这时候就要想其他的办法了,C里面有一个函数便可以从侧面实现模糊查找,它就是strstr()函数,该函数搜索一个字符串在另一个字符串里的第一次出现,并返回所搜索到字符串在另一个字符串中的位置,如果没有搜索到,则返回0(NULL)。根据此函数的性质,我们便能利用它来实现模糊查找,即对字符串查找时,当返回为非空时,即打印所进行搜索的字符串,例如 :
if(strstr(str1,str2)!=NULL)//str2 为所要要查找的内容, str1 为查找的区域。
{
cout<<str1<<endl;
}

下面给大家写个简单的学生管理系统,来看看是如何利用strstr函数实现模糊查找的:

#include<iostream>
#include<string.h>
using namespace std;


typedef struct Stu
{
 char name[20];
int num;
 char sex[20];
int birthday;
 char academy[20];
 char major[20];
char grade[20];


}stu;


void exchange(stu &a,stu &b)//对调位置函数
{
stu temp;
temp.num=a.num;  a.num=b.num;  b.num=temp.num;
temp.birthday=a.birthday; a.birthday=b.birthday; b.birthday=temp.birthday;
strcpy(temp.academy,a.academy);strcpy(a.academy,b.academy);strcpy(b.academy,temp.academy);
strcpy(temp.grade,a.grade);strcpy(a.grade,b.grade);strcpy(b.grade,temp.grade);
strcpy(temp.major,a.major);strcpy(a.major,b.major);strcpy(b.major,temp.major);
strcpy(temp.name,a.name);strcpy(a.name,b.name);strcpy(b.name,temp.name);
strcpy(temp.sex,a.sex);strcpy(a.sex,b.sex);strcpy(b.sex,temp.sex);


}


class student
{
public:
student()
{count=0;}
    void creat();
void sort();
    void add();
void delet();
void name_search();
void num_search();
void fuzzy_search();
void data_search();
void print();
private:
stu s[50]; int count;


};


void student::creat() //新建一个学生数据表
{


int i;


for(i=0;i<=50;i++)  
{
cout<<"输入学号"<<"(输入0结束):"<<endl;
        cin>>s[i].num;
if(s[i].num==0)break;
cout<<"依次输入学生姓名,性别,出生日期,所属学院,专业,年级"<<":"<<endl;
cin>>s[i].name>>s[i].sex>>s[i].birthday>>s[i].academy>>s[i].major>>s[i].grade;
count++;
}


}


void student::add()
{


cout<<"输入学号"<<":"<<endl;
        cin>>s[count].num;
cout<<"依次输入学生姓名,性别,出生日期,所属学院,专业,年级"<<":"<<endl;
cin>>s[count].name>>s[count].sex>>s[count].birthday>>s[count].academy>>s[count].major>>s[count].grade;


count++;cout<<endl;
sort();
}


void student::delet()
{
cout<<"输入要删除的学生的学号"<<": "<<endl;
int x,i;cin>>x;char a;
cout<<"确定要删除此学生信息?"<<"(n/y)"<<":";cin>>a;
if(a=='y')
{
for(i=0;i<count;i++)
{
if(s[i].num==x)
{
exchange(s[i],s[count-1]);
count--;
}


}
cout<<"删除完成!"<<endl;
cout<<" "<<endl;
sort();
}


}


void student::num_search()//二分法查找学生信息
{
int a,high,mid;
int low=0;
high=count-1;
cout<<"输入所要查找学生的学号:";
cin>>a;
while(low<=high)
{
mid=(low+high)/2;
if(a>s[mid].num){low=mid+1;mid=(low+high)/2;}
if(a==s[mid].num)break;
else
{
high=mid-1;
mid=(low+high)/2;
}
}
if(low<=high)
{
cout<<"学号:"<<s[mid].num<<endl;
cout<<"姓名:"<<s[mid].name<<endl;
cout<<"性别:"<<s[mid].sex<<endl;
cout<<"出生日期:"<<s[mid].birthday<<endl;
cout<<"所属学院:"<<s[mid].academy<<endl;
cout<<"专业:"<<s[mid].major<<endl;
cout<<"年级:"<<s[mid].grade<<endl;
}
else
{
cout<<endl;
cout<<"你要查找的学生不存在!请确认学号是否输入有误!"<<endl;


}
}


void student::name_search()
{
cout<<"输入你要查找的学生的姓名:";
char a[20];
cin>>a;char *p=a;
int i,j;
int k=0;
for(i=0;i<count;i++)
{
if(strcmp(s[i].name,a)==0)
{
   j=i;
   k++;
}
}
if(k==1)
{
cout<<"学号:"<<s[j].num<<endl;
cout<<"姓名:"<<s[j].name<<endl;
cout<<"性别:"<<s[j].sex<<endl;
cout<<"出生日期:"<<s[j].birthday<<endl;
cout<<"所属学院:"<<s[j].academy<<endl;
cout<<"专业:"<<s[j].major<<endl;
cout<<"年级:"<<s[j].grade<<endl;
}
else
{
cout<<"你要查找的学生不存在!请确认姓名是否输入有误!"<<endl;
cout<<"                                     "<<endl;
}
}


void student::fuzzy_search()
{
char a[20];
cout<<"请输入关键字:";
cin>>a;
cout<<endl;
int i,j,k=0;


for(i=0;i<count;i++)
{
if(strstr(s[i].name,a)!=NULL)
{
j=i;
k++;
}


}
if(k==1)
{
cout<<"学号:"<<s[j].num<<endl;
cout<<"姓名:"<<s[j].name<<endl;
cout<<"性别:"<<s[j].sex<<endl;
cout<<"出生日期:"<<s[j].birthday<<endl;
cout<<"所属学院:"<<s[j].academy<<endl;
cout<<"专业:"<<s[j].major<<endl;
cout<<"年级:"<<s[j].grade<<endl;
cout<<" "<<endl;
}
else
{
cout<<"模糊查找失败!请输入其他关键字!"<<endl;
cout<<" "<<endl;


}
}


void student::data_search()
{
int x;
cout<<"                        1:按姓名查找"<<endl;
cout<<"                        2:按学号查找"<<endl;
cout<<"                        3:模糊查找"<<endl;
cout<<"选择查找方式:";
cin>>x;
switch(x)
{
case 1:name_search();break;
case 2:num_search();break;
case 3:fuzzy_search();break;


}


}


void student::print()
{

int i;
for(i=0;i<count;i++)
{


cout<<"学号:"<<s[i].num<<endl;
cout<<"姓名:"<<s[i].name<<endl;
cout<<"性别:"<<s[i].sex<<endl;
cout<<"出生日期:"<<s[i].birthday<<endl;
cout<<"所属学院:"<<s[i].academy<<endl;
cout<<"专业:"<<s[i].major<<endl;
cout<<"年级:"<<s[i].grade<<endl;
cout<<" "<<endl;


}


}
void student::sort()
{

int i,j;
for(i=0;i<count-1;i++)
{


for(j=i+1;j<count;j++)
{

if(s[i].num>s[j].num)
{
       exchange(s[j],s[i]);
}

}




}
print();
}


int main()
{
int x;
student a;
do{
cout<<"----------------------------    学生信息管理    --------------------------------"<<endl;
cout<<"                     1:建立学生信息数据表"<<endl;
cout<<"                     2:按学号进行排序    "<<endl;
cout<<"                     3:添加学生信息      "<<endl;
cout<<"                     4:删除学生信息      "<<endl;
cout<<"                     5:查找学生信息      "<<endl;
cout<<"                     6:输出学生信息      "<<endl;
cout<<"                     7:结束              "<<endl;
cout<<" 请选择序号  "<<":  ";cin>>x;
switch(x)
{
case 1:  a.creat();break;
case 2:  a.sort();break;
case 3:  a.add();break;
case 4:  a.delet();break;
case 5:  a.data_search();break;
case 6:  a.print();break;
}
}while(x>=1&&x<7);


return 0;
}


在C语言中,你可以使用FFmpeg库来进行视频处理和解码。下面是一个示例代码片段,可以使用FFmpeg来模糊查找视频文件中某一帧的位置: ```c #include <stdio.h> #include <stdlib.h> #include <libavformat/avformat.h> #include <libavutil/imgutils.h> #include <libswscale/swscale.h> int find_frame_position(const char *video_path, int frame_number) { av_register_all(); AVFormatContext *format_context = NULL; if (avformat_open_input(&format_context, video_path, NULL, NULL) != 0) { fprintf(stderr, "无法打开视频文件\n"); return -1; } if (avformat_find_stream_info(format_context, NULL) < 0) { fprintf(stderr, "无法获取流信息\n"); avformat_close_input(&format_context); return -1; } int video_stream_index = -1; AVCodecParameters *codec_parameters = NULL; for (int i = 0; i < format_context->nb_streams; i++) { if (format_context->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { video_stream_index = i; codec_parameters = format_context->streams[i]->codecpar; break; } } if (video_stream_index == -1) { fprintf(stderr, "找不到视频流\n"); avformat_close_input(&format_context); return -1; } AVCodec *codec = avcodec_find_decoder(codec_parameters->codec_id); if (!codec) { fprintf(stderr, "找不到视频解码器\n"); avformat_close_input(&format_context); return -1; } AVCodecContext *codec_context = avcodec_alloc_context3(codec); if (!codec_context) { fprintf(stderr, "无法分配视频解码器上下文\n"); avformat_close_input(&format_context); return -1; } if (avcodec_parameters_to_context(codec_context, codec_parameters) < 0) { fprintf(stderr, "无法初始化视频解码器上下文\n"); avcodec_free_context(&codec_context); avformat_close_input(&format_context); return -1; } if (avcodec_open2(codec_context, codec, NULL) < 0) { fprintf(stderr, "无法打开视频解码器\n"); avcodec_free_context(&codec_context); avformat_close_input(&format_context); return -1; } AVPacket packet; av_init_packet(&packet); int frame_count = 0; while (av_read_frame(format_context, &packet) >= 0) { if (packet.stream_index == video_stream_index) { AVFrame *frame = av_frame_alloc(); int ret = avcodec_send_packet(codec_context, &packet); if (ret < 0) { fprintf(stderr, "解码器发送数据包失败\n"); av_frame_free(&frame); break; } ret = avcodec_receive_frame(codec_context, frame); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { av_frame_free(&frame); continue; } else if (ret < 0) { fprintf(stderr, "解码器接收帧失败\n"); av_frame_free(&frame); break; } frame_count++; if (frame_count == frame_number) { // 在这进行模糊查找 // frame->data[0] 是Y分量的数据,frame->data[1] 和 frame->data[2] 是U和V分量的数据 // frame->linesize[0] 是Y分量的行大小,frame->linesize[1] 和 frame->linesize[2] 是U和V分量的行大小 // 你可以使用这些数据来进行模糊查找 av_frame_free(&frame); break; } av_frame_free(&frame); } av_packet_unref(&packet); } avcodec_free_context(&codec_context); avformat_close_input(&format_context); return frame_count; } int main() { const char *video_path = "path_to_video_file.mp4"; int frame_number = 100; // 要查找的帧数 int found_frame = find_frame_position(video_path, frame_number); if (found_frame > 0) { printf("成功找到指定帧\n"); } else { printf("找不到指定帧\n"); } return 0; } ``` 你需要将`video_path`替换为你的视频文件路径,将`frame_number`替换为你要查找的帧数。在代码中的注释部分,你可以使用帧数据进行模糊查找。请确保你已经正确设置了FFmpeg库,并将其链接到你的项目中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值