比较字符串的问题.
我有两个字符串S1,S2,想比较它们是否相同,问题是我希望把任何出现字符A的地方都当作通配符看待,请问如何实现。
比如S1="AEWEF"和 S2="TEWAF" 在我看来应该是一样的。
先谢谢了。
[解决办法]
/*
s1 == s2 return 0
s1 > s2 return 1
s1 < s2 return -1
*/
int mycmp(const char* s1, const char* s2)
{
int len1 = strlen(s1);
int len2 = strlen(s2);
/* 这里要处理一下len1或len2等于零的情况 */
if (len1 == 0 && len2 > 0)
return -1;
else if ( len1 > 0 && len2 == 0)
return 1;
else if (len1 == 0 && len2 == 0)
return 0;
/* 这里开始正经的比较 */
int i = 0;
for (; i <len1 && i <len2; i++)
{
if (*(s1+i) == 'A ' || *(s2+i) == 'A ' || *(s1+i) == *(s2+i))
continue;
if (*(s1+i)> *(s2+i))
return 1;
else if (*(s1+i) <*(s2+i))
return -1
}
/* 善后处理 */
if (i == len1 & i == len2) return 0;
if (i == len1 & i > len2) return 1;
if (i == len2 & i > len1) return -1;
}
[解决办法]
首先比较长度,然后逐个比较,遇到 'A ',就直接跳过不做比较
[解决办法]
:( 忘完了!
=============================================
#include <stdio.h>
#include <conio.h>
#include <string.h>
int StrComp(char *s1, char *s2)
{
int i = 0;
//If the length of two string doesn 't the same, return false directly
if (strlen(s1) != strlen(s2))
return 0;
while(1)
{
if ((s1[i] == 'a ') || (s1[i] == 'A ') || (s2[i] == 'a ') || (s2[i] == 'A '))
{
i++;
continue;
}
if (s1[i] != s2[i]) return 0;
++i;
if (i > = strlen(s1))break;
}
return 1;
}
int main(int argc, char *argv[])
{
char s1[50], s2[50];
printf( "Input s1:\n ");
scanf( "%s ", s1);
printf( "Input s2:\n ");
scanf( "%s ", s2);
if ( StrComp(s1, s2) == 1)
printf( "The %s is the same as %s. ", s1, s2);
else
printf( "The %s isn 't the same as %s. ", s1, s2);
getch();
}
[解决办法]
/*
0 : s1 == s2
1 : s1 > s2
-1 : s1 < s2
*/
int cmp_string(const char s1[], const char s2[])
{
int len1 = strlen(s1);
int len2 = strlen(s2);
if (len1 > len2)
return 1;
if (len2 > len1)
return -1;
for (int i = 0; i < len1; ++i)
{
if (s1[i] == 'A ' || s2[i] == 'A ')
continue;
if (s1[i] > s2[i])
return 1;
if (s2[i] > s1[i])
return -1;
}
return 0;
}
int main(int argc,char* argv[])
{
char s1[] = "AEWAF ";
char s2[] = "TEWAF ";
cout < <cmp_string(s1, s2) < <endl;
}
[解决办法]
//优化版的,没试,不知对不对
/*
s1==s2 return 0
s1> s2 return 1
s1 <s2 return -1
*/
int mystrcmp(const char* s1,const char* s2)
{
int r = 0 ;
while(!(r = *(unsigned char*)s1 - *(unsigned char*)s2) && *s2 ||
!(r=!(*(unsigned char*)s1 == 'A '))||
!(r=!(*(unsigned char*)s2 == 'A '))
++s1, ++s2;
if (r < 0) r = -1 ;
else if (r > 0) r = 1 ;
return r;
}
[解决办法]
给你推荐一个最简便的方法.
即首先分别把两个串S1和S2中的含有通配符 'A '的地方替换成另一个串相同位置的字符,这样两个字符串在有通配符的位置的内容都相同,就不必处理 'A '字符了.然后直接调用strcmp比较两字符串即可
//返回1表示相同字符串
int compare(char * S1, char* S2)
{
if((strlen(S1) != strlen(S2))
return 0; // 不相等
for(int i = 0; i < strlen(S1); ++i)//替换通配符
{
if(*(S1 + i) == 'A ')
*(S1 + i) = *(S2 + i);
}
for(i = 0; i < strlen(S1); ++i)
{
if(*(S2 + i) == 'A ')
*(S2 + i) = *(S1 + i);
}
if(strcmp(S1, S2) == 0) //字符串相同
return 1;
else return 0;
}