在C语言中比较两个字符数组

6

我有一个字符串结构。

struct string
{
   char *c;
   int length;
   int maxLength;
}

我想检查两个字符串是否相等。

所以我想运行一个for循环。

for(int i = 0; i < length; i++)
   if(s1[i] != s2[i]) // This code is more C# than C.

s1和s2都是字符串结构体。
如何处理if(s1[i] != s2[i])
编辑: 我刚刚做了这个,是否有点过头了?
    for(i = 0; i < length; i++)
    if((*s1).c[i] != (*s2).c[i])
    {
        printf("Failed");
        return 0;
    }

可能是重复的问题,与String Comparison相似。 - BergQuester
我们能看到s1s2的声明吗? - exexzian
展示一下你如何声明s1和s2。 - Felice Pollano
虽然你可以写(*s1).c[i],但C程序员会写s1->c[i] - Jonathan Leffler
1
在C语言中(不是C++),(*s1).cs1->c相同,但出于美观的原因,建议使用s1->c - Basile Starynkevitch
显示剩余2条评论
5个回答

10

假设您可以使用以\0结尾的C字符串,我会这样做并使用strcmp

if (strcmp(s1.c, s2.c)) {
    // action if strings are not equal
}

你应该在这里注意,如果字符串不相等,你将执行if语句中的操作。 - Fantastic Mr Fox

6

我假设你想自己编写比较代码,而不是使用内置函数如strcmp()——这些函数可能通过编写或生成优化的汇编代码来提高性能。如果字符串相等,则are_equal()函数将返回1(true),否则返回0(false)。

次优解决方案

static inline int min(int a, int b) { return (a < b) ? a : b; }

int are_equal(const struct string *s1, const struct string *s2)
{
    int len = min(s1->length, s2->length);
    int i;
    for (i = 0; i < len; i++)
    {
        if (s1->c[i] != s2->c[i])
            return 0;  // They are different
    }
    return(s1->c[i] == s2->c[i]);
}

inline函数默认需要C99编译器支持;如果你被迫使用C89,可以将其替换为适当的宏。

更接近最优解决方案

int are_equal(const struct string *s1, const struct string *s2)
{
    if (s1->length != s2->length)
        return 0; // They must be different
    for (int i = 0; i < s1->length; i++)
    {
        if (s1->c[i] != s2->c[i])
            return 0;  // They are different
    }
    return 1;  // They must be the same
}

两个版本的代码都假定s1->cs2->c中的字符串以空字符结尾,并且s1->length == strlen(s1->c)s2->length == strlen(s2->c)
使用C99,也可以将返回类型用_Bool,或者使用<stdbool.h>bool作为返回类型,用truefalse作为返回值。

使用strcmp()的替代解决方案

请注意,如果您只是使用strcmp(),则如果字符串相等,您将得到0,如果字符串不相等,则会得到非零值。因此,您也可以按照以下方式编写函数:如果字符串相等,则返回true,否则返回false:
int are_equal(const struct string *s1, const struct string *s2)
{
    return strcmp(s1->c, s2->c) == 0;
}

1
为什么要检查最小值?min(s1->length, s2->length); 如果它们相等,大小不应该是相同的吗?也就是说,如果它们的长度不同,那么返回false。在运行for循环之前,我会比较它们的长度--这只是一个建议。 - user2085599
@Redanium:感谢你的修复 - 我已经将其中重要的部分合并到答案中。很抱歉你的建议编辑被拒绝了,尽管我可能会撤销返回类型的更改(你将其改为bool,这不是错误,但与帖子的其他部分不一致)。 - Jonathan Leffler

3
您的if语句不完整(可能缺少设置标志然后使用breakreturn),且您没有使用struct,因此请注意。
struct string {
  char *c;
  int length;
  int maxLength;
};

bool same_string (struct string *s1, struct string* s2) {
  int ln1 = s1->length;
  if (ln1 != s2->length) return false;
  for (int i=0; i<ln1; i++)
    if (s1->c[i] != s2[ci]) return false;
  return true;
}

但您实际需要的是 strncmp,即只需
bool same_string (struct string *s1, struct string* s2) {
  if (s1->length != s2->length) return false;
  return strncmp(s1->c, s2->c, s1->length)==0;
}

1
你需要比较每个成员。
int compare(struct string s1, struct string s2){

return (strcmp(s1.c,s2.c) == 0) && 
       (s1.maxLength ==s2.maxLength) &&
       (s1.length ==s2.length) ;
}

for(int i = 0; i < length; i++)
   if(!compare(s1,s2)) { 
  }

0

您实际上不需要知道字符串的长度就可以比较它们。您可以使用标准库中的字符串比较工具strncmp,最好是使用strcmp,或者您可以编写类似于以下代码的自己的函数:

int strcmp(char *s1, char *s2)
{
  int i;
  for (i = 0; s1[i] == s2[i]; i++)
    if (s1[i] == '\0')
      return 0;
  return s1[i] - s2[i];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接