C布尔函数按字母顺序比较2个字符串

时间:2017-12-02 22:43:38

标签: c string string-comparison

所以我试图比较2个字符串,如果第一个字符串(x)小于第二个字符串,则方法twoStrComp应返回true,否则它应该为false。

这是我的代码,虽然当我尝试在我的终端上运行时没有出现任何问题...... 好像它忽略了我的代码..另外我想知道它是否会更有效的指针,但我不知道如何声明它们,我可以做两个StrComp(* x,* y)? 原始代码:

#include <stdio.h>
#include <stdbool.h>

bool twoStrComp(char[], char[]);

int main(void)
{
  char x[]= "test";
  char y[]= "another";
  twoStrComp(x,y);      
}

bool twoStrComp(char string1[], char string2[] )
{
  int i=0, flag=0;    
  while(flag==0)
  {
    if (string1[i]<string2[i])
    {
      flag=-1;
    }
    else if (string1[i]==string2[i])
    {
      flag=0;
      i++
    }
    else
    {
      return 1;
    }
  }         
  return flag;
}  

新版本:

bool twoStrComp(char[], char[]);

int main(void)
{
    char x[]= "atest";
    char y[]= "another";
    bool ans = twoStrComp(x,y);
    printf("%s", ans ? "true" : "false");

}

bool twoStrComp(char string1[], char string2[] )
{
    int i=0, flag=0;
    bool value = false;
       while(flag==0) {
        if (string1[i]>string2[i])
        {
            flag=1;
            value = false;
        }
        else if (string1[i]<string2[i])
        {
            flag=-1;
            value = true;
        }
        else if (string1[i]==string2[i])
        {
            return 0;
            value = true;
        }
        else
        {
            i++;
        }
    }
    if(flag == 1)
        return (value == false);
    if(flag == -1)
        return (value == true);
 return value;
}

1 个答案:

答案 0 :(得分:1)

  

所以我试图比较2个字符串,如果第一个字符串(x)小于第二个字符串,则方法twoStrComp应返回true,否则它应该为false。

我建议你的功能更好的名字。它不是通用比较函数,但它更像是isSmaller函数。您不关心相同或更大值的单独案例。

  

这是我的代码,虽然当我尝试在我的终端上运行它时没有出现

如果您想在控制台上看到任何内容,则需要打印一些内容。您可以将printf用于此目的。

  

另外我想知道指针是否更有效但我不确定如何声明它们,我可以做两个StrComp(* x,* y)吗?

如果要传递指针,可以这样声明:

bool twoStrComp(const char *x, const char *y)

但是,.... 将数组作为参数传递会导致传递指针。当在函数的参数列表中使用时,数组衰减为指针。你不会看到任何性能提升。

关于你的代码...... 我指的是编辑历史中列为版本2的版本。

您返回1或-1。当您使用类型bool作为返回类型时,您应该考虑使用TRUEFALSE。或者至少在某些情况下返回0。

设置flag=0;没有任何意义。如果它之前不是0,你就会离开循环。

您不会检查是否比字符串末尾更新。

修复这些问题并包含一些测试用例的版本可能如下所示:

#include <stdbool.h>
#include <stdio.h>

bool twoStrComp(char string1[], char string2[]);

int main(void)
{
  char x[]= "test";
  char y[]= "another";
  bool isSmaller = twoStrComp(x,y);
  printf("Is x(%s) smaller than y(%s)? %s\n", x, y, isSmaller ? "YES" : "NO");

  isSmaller = twoStrComp(y,x);
  printf("Is y(%s) smaller than x(%s)? %s\n", y, x, isSmaller ? "YES" : "NO");

  char x2[]= "aaa";
  char y2[]= "aab";

  isSmaller = twoStrComp(x2,y2);
  printf("Is x2(%s) smaller than y2(%s)? %s\n", x2, y2, isSmaller ? "YES" : "NO");

  isSmaller = twoStrComp(y2,x2);
  printf("Is y2(%s) smaller than x2(%s)? %s\n", y2, x2, isSmaller ? "YES" : "NO");

  isSmaller = twoStrComp(x2,x2);
  printf("Is x2(%s) smaller than x2(%s)? %s\n", x2, x2, isSmaller ? "YES" : "NO");
}

bool twoStrComp(char string1[], char string2[])
{
  int i=0;
  while (true)
  {
    if (string1[i] < string2[i])
      return true; // First one smaller than second one...
    else if (string1[i] > string2[i])
      return false; // First one larger than second one...
    else if (!string1[i])
      return false; // identical and end of strings reached.
    else
      i++;   // identical, not yet decided.
  }

  // We cannot get here, but the compiler complains...
  return false;         
}