簡體   English   中英

比較C中的兩個字符數組

[英]Compare Two Character Arrays in C

我有一個字符串結構。

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;
    }

假設您可以使用帶有\\0終止的C字符串,我會這樣做並使用strcmp

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

我假設您想自己編寫比較代碼,而不是使用strcmp()這樣的內置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;
}

你的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;
}

您需要比較每個成員

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)) { 
  }

你真的不需要知道字符串的長度來比較它們。 您可以使用標准庫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];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM