不使用函数比较两个字符串

时间:2014-05-21 11:26:05

标签: c string

我必须比较两个字符串,并说明它们是否相同。 要小心,因为这里的意思相同:相同的字母,但不是必须以相同的顺序,而不是必要的大写或小写。

示例: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:不使用功能。

3 个答案:

答案 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");    
}