在C中逐个字符地比较两个字符串

时间:2014-06-05 14:40:17

标签: c string

我有一个'简单'(我希望)的问题。我实际上编写了一些小程序,我需要比较两个字符串,相同的长度,但不同的字母,如

Eagle

Hdjoh

我想比较第一个字符串的第一个字母和第二个字符串的第一个字母, 第一个字符串的第二个字母,第二个字母的第二个字母等。

我开始这样做:

for(i=0, i<N, i++){
        for(j=0, j<N, j++){
            if(string1[i]==string1[j] etc.. etc..
        }
    }

我清楚地看到它没有比较第一个字母和第一个字母,第二个字母和第二个字母等。

所以也许有人知道我该怎么做? (不使用string.h的任何函数,我想''我自己'')。

也许这是一个愚蠢的问题,但我仍然是C的新手......

啊,最后一件事,我在我的例子中用5个字符定义了两个字符串,但它可能超过5个而不是5个。

感谢提出的想法。


编辑1:

#include <stdio.h>
#define N 20

int main()
{
    unsigned char string1[N], string2[N];
    int Answer=0, i=0;
    scanf("%s", string1);
    scanf("%s", string2);

    for(i=0; i<N; i++){
        if(string1[i]==string2[i]){
            Answer=1;
        }
        else{
            Answer=0;
        }
    }

    printf("Answer = %d", Answer);

    return 0;
}

5 个答案:

答案 0 :(得分:8)

为什么要为此使用嵌套for循环?如果两个字符串的大小为n,请执行以下操作:

for(int i=0;i<n;i++){
    if(string1[i]==string2[i]){
      //do something
    else if(// lesser than condition)
      //do something else
    else if(//greater than condition)
      //do something else other than the previous something
}

i=0时,您将string1[0]string2[0]进行比较,在i=1时,您将string1[1]string2[1]进行比较,依此类推.....

答案 1 :(得分:3)

您使用嵌套循环的方法并未经过深思熟虑。

显然,它会将第二个字符串的所有字母与第一个字符串的第一个字母进行比较,然后对第一个字符串的第二个字母进行相同的操作,依此类推。完全没有理想的行为。

重新实施strcmp()并不是很难,这是一个镜头:

int my_strcmp(const char *a, const char *b)
{
  for(; *a && *b && *a == *b; ++a, ++b)
    ;
  if(*a < *b)
    return -1;
  return *a > *b;
}

请注意,当字符串相等时,它会返回。编写测试的好方法是:

if(my_strmcp(a, b) == 0)
{
  printf("two equal strings: '%s' and '%s'\n", a, b);
}

有些人将其写为if(!my_strcmp()),但我不建议这样做,因为它会捣乱这么多概念。

答案 2 :(得分:2)

您希望对两个字符串使用相同的索引进行比较:

unsigned len = strlen(s1);
assert(len == strlen(s2) && "Strings not the same length");

for (unsigned i = 0; i < len; i += 1)
{
    if (s1[i] != s2[i])
        return false; /* strings are not equal */
}
return true; /* strings are equal */

确保字符串具有相同的编码,ASCIIUTF8或其他。比较不同编码的字符串会导致麻烦:)

答案 3 :(得分:1)

此代码逐个字符地进行比较。请注意,这不适用于加密代码,因为它容易受到定时攻击

for(i=0; i<N; i++){
    if(string1[i]==string2[i]){
         equal = 1;
    }else{
        equal = 0;
        break;
    }
}

注意:
我假设长度相同(如所述) 我也假设字符串是非零长度

这些假设在其他代码中可能都不正确。

答案 4 :(得分:1)

简单比较每个元素,直到找到字符串的结尾或差异。

size_t i = 0;
while (string1[i] != '\0' && string1[i] == string2[j]) i++;
int StringTheSame = string1[i] == string2[j];

这会忽略N,但会在遇到字符串结尾('\0')时停止。


[编辑] @Kartik_Koro建议关注时间攻击。以下是一个恒定的时间解决方案

int diff_bits = 0;
for(size_t i=0; i<N; i++) {
  diff_bits |= string1[i] ^ string2[i];
}
int equal = diff_bits == 0;

如果字符串的长度短于N-1,则上述问题,但根据OP的要求,应该不会发生。