user-0 提问: 求字符串匹配C程序代码

回复:
user: user-1
content: 再供参考//摘自《代码之美》 // 字符     含义 // .        匹配任意的单个字符 // ^        匹配输入字符串的开头 // $        匹配输入字符串的结尾 // *        匹配前一个字符的零个或者多个出现 #include <stdio.h> int matchhere(char *regexp, char *text);  int matchstar(int c, char *regexp, char *text) {// matchstar: search for c*regexp at beginning of text    do {// a * matches zero or more instances        if (matchhere(regexp, text)) return 1;    } while (*text != '\0' && (*text++ == c || c == '.'));    return 0; } int matchhere(char *regexp, char *text) {// matchhere: search for regexp at beginning of text    if (regexp[0] == '\0') return 1;    if (regexp[1] == '*') return matchstar(regexp[0], regexp+2, text);    if (regexp[0] == '$' && regexp[1] == '\0') return *text == '\0';    if (*text!='\0' && (regexp[0]=='.' || regexp[0]==*text)) return matchhere(regexp+1, text+1);    return 0; }  int match(char *regexp, char *text) {// match: search for regexp anywhere in text     if (regexp[0] == '^') return matchhere(regexp+1, text);     do {// must look even if string is empty         if (matchhere(regexp, text)) return 1;     } while (*text++ != '\0');     return 0; } void main() {     printf("%d==match(abc ,abc)\n",match("abc" ,"abc"));     printf("%d==match(^a  ,abc)\n",match("^a"  ,"abc"));     printf("%d==match(c$  ,abc)\n",match("c$"  ,"abc"));     printf("%d==match(a.c ,abc)\n",match("a.c" ,"abc"));     printf("%d==match(a.*c,abc)\n",match("a.*c","abc"));     printf("-------------------\n");     printf("%d==match(ABC ,abc)\n",match("ABC" ,"abc"));     printf("%d==match(^B  ,abc)\n",match("^B"  ,"abc"));     printf("%d==match(A$  ,abc)\n",match("A$"  ,"abc"));     printf("%d==match(a..c,abc)\n",match("a..c","abc"));     printf("%d==match(a.*d,abc)\n",match("a.*d","abc")); } //1==match(abc ,abc) //1==match(^a  ,abc) //1==match(c$  ,abc) //1==match(a.c ,abc) //1==match(a.*c,abc) //------------------- //0==match(ABC ,abc) //0==match(^B  ,abc) //0==match(A$  ,abc) //0==match(a..c,abc) //0==match(a.*d,abc)

user: user-2
content: ref: http://baike.baidu.com/view/2020247.htm?fr=aladdin

user: user-1
content: 引用 5 楼 huyidao88116 的回复:谢谢亲们的指教！可能是我问题没描述好，还有以下这种情况：  第一个字符串：AB-ADSP-21060LKS-160 第二个字符串：DEF-ADSP_21060_QFP  字符串一开始就不相同，中间连续一部分相同，占第二个字符串长度60%以上 仅供参考#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }

user: user-0
content: 各位大神求指教啊 ，感激不尽啊

user: user-0
content: 谢谢亲们的指教！可能是我问题没描述好，还有以下这种情况：  第一个字符串：AB-ADSP-21060LKS-160 第二个字符串：DEF-ADSP_21060_QFP  字符串一开始就不相同，中间连续一部分相同，占第二个字符串长度60%以上

user: user-0
content: 第一个字符串：yuADSP-21060LKS-160 第二个字符串：rtyADSP_21060_QFP 两个字符串中除去“-” 和“_”符号，只剩下字母和数字，比较两个字符串（不区分大小写），连续相同位数超过第二个字符串长度的60%，判断为相同。

user: user-3
content: 最开始我写的也是判断是否 "-" 或 "_" 如果要求这样，那么你可以稍微改改： int IsStringSimilar(const char *psz1, const char *psz2) {     int cch = 0;     int len = 0;     if (psz1 != NULL && psz2 != NULL) {         len = strlen(psz2) * 0.6;         while (*psz1 != '\0' && *psz2 != '\0') {             while (*psz1 == '-' || *psz1 == '_') {                 psz1++;             }             while (*psz2 == '-' || *psz2 == '_') {                 psz2++;             }             if (*psz1 != *psz2) {                 break;             }             cch++;             psz1++;             psz2++;         }     }     return cch > len; }这个则是只跳过 "-" 和 "_"，其他的如果不同则认为字符串不相似。同时这里也修改了是判断字符串 2 的总长度而非减去不合法字符的长度。如果这两个都不能满足要求，可根据以上两个代码适当组合达到目的。

user: user-3
content: #include <stdio.h> #include <stdlib.h>  int IsStringSimilar(const char *psz1, const char *psz2) {     int cch = 0;     int len = 0;     if (psz1 != NULL && psz2 != NULL) {         len = strlen(psz2);         while (*psz1 != '\0' && *psz2 != '\0') {             /* 跳过字符串1中连续非数字字母字符 */             while (!isalnum(*psz1)) {                 psz1++;             }             /* 跳过字符串2中连续非数字字母字符，并将总长度减去这些字符 */             while (!isalnum(*psz2)) {                 len--;                 psz2++;             }             /* 如果两个字符不想等则直接终止 */             if (*psz1 != *psz2) {                 break;             }             /* 相等总数++ */             cch++;             /* 字符串1和2指针++ */             psz1++;             psz2++;         }     }     /* 相等总数是否大于等于字符串2中除去非数字字母字符的字符总数*0.6 */     return cch > (len * 0.6); }  int main(int argc, char *argv[]) {     // 0     printf("%d\n", IsStringSimilar("ADSP~210", "ADSP_21060_QFP"));     // 1     printf("%d\n", IsStringSimilar("ADSP-2106", "ADSP_21060_QFP"));     // 1     printf("%d\n", IsStringSimilar("ADSP-21060LKS-160", "ADSP_21060_QFP"));     return 0; }

user: user-4
content: 大概写了一个，可能不是太符合要求，仅供参考： int strcmp_l(const char *s1, const char *s2) {     const int len = strlen(s2);     const char *s2_end = s2 + (int)(len * 0.6);     for ( ; *s1 && *s2 && s2 != s2_end && *s1 == *s2; )     {         if ('-' == *s1 || '_' == *s1)         {             ++s1;             continue;         }         if ('-' == *s2 || '_' == *s2)         {             ++s2;             continue;         }          ++s1;         ++s2;     }     return *s1 - *s2;  }

user: user-1
content: 仅供参考#include <stdio.h> #include <string.h> #include <locale.h> char s[256]; char *p; int r,n,i; int main() {     setlocale(LC_ALL,"chs");     while (1) {         printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");         fgets(s,256,stdin);         if ('\n'==s[0]) break;         p=s;         while (1) {             p=strstr(p,"%20");             if (p) {                 memmove(p+1,p+3,strlen(p)-3+1);                 p[0]=' ';             } else break;         }         p=s;         while (1) {             p=strstr(p,"你懂得");             if (p) {                 memmove(p+6,p+6,strlen(p)-6+1);                 for (i=0;i<6;i++) p[i]='X';             } else break;         }         printf("%s",s);     }     return 0; } //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //abcdefg%20helloworld%20something.pdf //abcdefg helloworld something.pdf //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //这是测试文字你懂得，在这个你懂的地方，就得做你懂得的事 //这是测试文字XXXXX，在这个你懂的地方，就得做XXXXX的事 //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //   C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\STRICMP.C/*** *stricmp.c - contains case-insensitive string comp routine _stricmp/_strcmpi * *       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved. * *Purpose: *       contains _stricmp(), also known as _strcmpi() * *******************************************************************************/  #include <cruntime.h> #include <string.h>  #ifdef _WIN32 #include <mtdll.h> #include <setlocal.h> #include <ctype.h> #include <locale.h> #endif  /* _WIN32 */  /*** *int _stricmp(dst, src), _strcmpi(dst, src) - compare strings, ignore case * *Purpose: *       _stricmp/_strcmpi perform a case-insensitive string comparision. *       For differences, upper case letters are mapped to lower case. *       Thus, "abc_" < "ABCD" since "_" < "d". * *Entry: *       char *dst, *src - strings to compare * *Return: *       <0 if dst < src *        0 if dst = src *       >0 if dst > src * *Exceptions: * *******************************************************************************/  int __cdecl _stricmp (         const char * dst,         const char * src         ) {         return( _strcmpi(dst,src) ); }   int __cdecl _strcmpi(const char * dst, const char * src) {         int f,l; #ifdef _MT         int local_lock_flag; #endif  /* _MT */  #if defined (_WIN32)         if ( __lc_handle[LC_CTYPE] == _CLOCALEHANDLE ) { #endif  /* defined (_WIN32) */             do {                 if ( ((f = (unsigned char)(*(dst++))) >= 'A') && (f <= 'Z') )                     f -= ('A' - 'a');                  if ( ((l = (unsigned char)(*(src++))) >= 'A') && (l <= 'Z') )                     l -= ('A' - 'a');             } while ( f && (f == l) ); #if defined (_WIN32)         }         else {             _lock_locale( local_lock_flag )             do {                 f = _tolower_lk( (unsigned char)(*(dst++)) );                 l = _tolower_lk( (unsigned char)(*(src++)) );             } while ( f && (f == l) );             _unlock_locale( local_lock_flag )         } #endif  /* defined (_WIN32) */          return(f - l); }