日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言给定一个字符串匹配,使用C语言解决字符串匹配问题的方法

發(fā)布時間:2025/3/8 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言给定一个字符串匹配,使用C语言解决字符串匹配问题的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最常想到的方法是使用KMP字符串匹配算法:

#include

#include

#include

int get_nextval(char *pattern,int next[])

{

//get the next value of the pattern

int i = 0,j = -1;

next[0] = -1;

int patlen = strlen(pattern);

while ( i < patlen - 1){

if ( j == -1 || pattern[i] == pattern[j]){

++i;

++j;

if (pattern[i] != pattern[j])

next[i] = j;

else

next[i] = next[j];

}

else

j = next[j];

}

return(0);

}

int kmpindex(char *target,char *pattern,int pos)

{

int tari = pos,pati = 0;

int tarlen = strlen(target),patlen = strlen(pattern);

int *next = (int *)malloc(patlen * sizeof(int));

get_nextval(pattern,next);

while ( tari < tarlen && pati < patlen ){

if (pati == -1 ||target[tari] == pattern[pati]){

++tari;

++pati;

}else{

pati = next[pati];

}

}

if(next != NULL) free(next);

next = NULL;

if (pati == patlen)

return tari - pati;

else

return -1;

}

int main()

{

char target[50],pattern[50];

printf("imput the target:\n" );

scanf("%s",target);

printf("imput the pattern:\n" );

scanf("%s",pattern);

int ans = kmpindex(target,pattern,0);

if (ans == -1)

printf("error\n");

else

printf("index:%d\n",ans);

return 0;

}

練習題??? 題目描述:

讀入數據string[ ],然后讀入一個短字符串。要求查找string[ ]中和短字符串的所有匹配,輸出行號、匹配字符串。匹配時不區(qū)分大小寫,并且可以有一個用中括號表示的模式匹配。如“aa[123]bb”,就是說aa1bb、aa2bb、aa3bb都算匹配。

輸入:

輸入有多組數據。

每組數據第一行輸入n(1<=n<=1000),從第二行開始輸入n個字符串(不含空格),接下來輸入一個匹配字符串。

輸出:

輸出匹配到的字符串的行號和該字符串(匹配時不區(qū)分大小寫)。

樣例輸入:

4

Aab

a2B

ab

ABB

a[a2b]b

樣例輸出:

1 Aab

2 a2B

4 ABB

ac代碼

#include

#include

#include

#define MAX 1001

#define LEN 101

struct str

{

char name[101];

};

int main()

{

struct str strs[MAX];

struct str t[LEN];

int i,n,len,j,k,left,right,count,flag;

char text[LEN],newtext[LEN];

while (scanf("%d",&n) != EOF) {

// 接收數據

getchar();

for (i = 0; i < n; i ++) {

scanf("%s",strs[i].name);

}

// 接收文本串

getchar();

gets(text);

len = strlen(text);

for (i = left = right = 0; i < len; i ++) {

if (text[i] == '[') {

left = i;

} else if (text[i] == ']') {

right = i;

break;

}

}

count = right - left - 1;

if (count <= 0) { // 沒有正則匹配

for (i = j = 0; i < len; i ++) {

if (text[i] != '[' && text[i] != ']') {

newtext[j ++] = text[i];

}

}

newtext[j] = '\0';

for (i = 0; i < n; i ++) {

if (strcasecmp(strs[i].name,newtext) == 0) {

printf("%d %s\n",i + 1,strs[i].name);

}

}

}else { // 需要正則匹配

for (j = 1,k = 0; j <= count; j ++,k ++) { // 構建文本數組

memset(t[k].name,'\0',sizeof(t[k].name));

for (i = 0; i < left; i ++) {

t[k].name[i] = text[i];

}

t[k].name[i] = text[left + j];

strcat(t[k].name,text + right + 1);

}

// 正則匹配

for (i = 0; i < n; i ++) {

for (j = flag = 0; j < count; j ++) {

if (strcasecmp(strs[i].name,t[j].name) == 0) {

flag = 1;

break;

}

}

if (flag) {

printf("%d %s\n",strs[i].name);

}

}

}

}

return 0;

}

/**************************************************************

Problem: 1165

User: wangzhengyi

Language: C

Result: Accepted

Time:0 ms

Memory:948 kb

****************************************************************/

總結

如果覺得編程之家網站內容還不錯,歡迎將編程之家網站推薦給程序員好友。

本圖文內容來源于網友網絡收集整理提供,作為學習參考使用,版權屬于原作者。

小編個人微信號 jb51ccc

喜歡與人分享編程技術與工作經驗,歡迎加入編程之家官方交流群!

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的c语言给定一个字符串匹配,使用C语言解决字符串匹配问题的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。