我必须比较两个字符串,并说明它们是否相同。 要小心,因为这里的意思相同:相同的字母,但不是必须以相同的顺序,而不是必要的大写或小写。
示例:Good-Luck和luCkog-od是相同的(对我而言!)。多数民众赞成我想做的事。
-
这就是我已经做过的事情:
#include <stdio.h>
int main()
{
int length, i = 0, j = 0, same=0, different=0;
char string1[101];
char string2[101];
printf("Please enter the length of the two strings\n");
scanf("%d", &length);
getchar();
printf("\nPlease enter the first string\n");
while((string1[i] = getchar())!='\n')
i++ ;
string1[i] = '\0';
printf("\nPlease enter the second string\n");
while((string2[j] = getchar())!='\n')
j++ ;
string2[j] = '\0';
for(i=0; i<=(length-1); i++){
for(j=0; j<=(length-1); j++){
if(string1[i]==string2[j] || string1[i]==string2[j] + 32 || string1[i]==string2[j] - 32){
same++;
}
if(string1[i]!=string2[j] || string1[i]!=string2[j] + 32 || string1[i]!=string2[j] - 32){
different++;
}
}
}
if(same>=length && different<=length*length){
printf("\nThe two strings are the same!");
}
else{
printf("\nThe two strings are not the same!");
}
return 0;
}
所以这段代码很适合很多例子,但在这种情况下:
3d-Cubes X Y * Z = string1
立方体 x \ Y Z-3D = string2
它不起作用!该程序说是相同的,但它不是因为在第二个字符串中的\!
-
我的问题:
为了让我的代码也适用于这样的例子,我必须添加/修改什么?
有更简单的事情吗? (而不是我所做的(使用FOR))。
P.S:不使用功能。
答案 0 :(得分:4)
您只检查string1中的每个字符都出现在string2中,并且字符串的长度相同。
你没有检查string2中的每个字符都出现在string1中,所以如果你在string1中有任何重复的字符(例如你的例子中的's'),你可能会错误地认为字符串是相同的。我认为他们也会同样对待'aab'和'abb'。
您还可以将相隔32个字符的字符视为相同,但您只应对字母而不是任何其他字符执行此操作。
相反,您可以为每个字符串创建一个包含256个条目的int数组,并计算每个字符串中每个字符的事件(确保通过添加'a' - 'A'来修改'A'和'Z'之间的任何内容在增加数组中的计数之前,处理案例问题。
然后迭代数组,确保它们是相同的。
答案 1 :(得分:1)
这是基于查找表的解决方案,假设您已将其读入。我没有测试这个,所以case-transform可能不正确。如果你愿意,你也可以将它们放在同一个循环中,因为你有相同的长度作为前提条件:
char *str1; //all ready to go
char *str2; //also ready to go
int countOne[128] = {0}, countTwo[128] = {0}, ndx, equal = 1;
while (*str1) {
if (*str1 >= 'A' && *str1 <= 'Z')
countOne[*str1++ + 'a' - 'A']++;
else
countOne[*str1++]++;
}
while (*str2) {
if (*str2 >= 'A' && *str2 <= 'Z')
countOne[*str2++ + 'a' - 'A']++;
else
countOne[*str2++]++;
}
for (ndx = 0; ndx < 128 && equal; ndx++)
equal = countOne[ndx] == countTwo[ndx];
//equal now has whether they are equal.
答案 2 :(得分:0)
请检查以下代码。它可能会帮助你...... 如果您不希望修改现有内容,请相应地使用额外的变量进行备份。
main()
{
char s[120],t[120];
int i,j,extra;
printf("enter first string:");
gets(s);
flushall();
printf("enter second string:");
gets(t);
for(i=0;s[i];i++)
{
if(s[i]>=65&&s[i]<=90)
s[i]+=32;
for(j=0;t[j];j++)
{
if(t[j]>=65&&t[j]<=90)
t[j]+=32;
if(s[i]==t[j])
{
t[j]=1;
break;
}
}
if(!t[j])
break;
}
for(i=extra=0;t[i];i++)
if(t[i]!=1)
extra++;
if(!s[i] && extra==0)
printf("matched");
else
printf("not matched");
}