如果两个数组完全不同则返回1的函数,如果有一个共同元素则返回0

时间:2017-04-17 17:31:56

标签: c

我已尝试过这段代码,但它似乎无法正常工作,如何摆脱嵌套循环?

#include <stdio.h>
#include <string.h>

int meme(char s1[], char s2[])
{
    int i = 0, j = 0;
    int different;

    while (i <= strlen(s1) && different == 1) {
        while (j <= strlen(s2)) {
            if (s1[i] != s2[j]) {
                different = 1;
            } else {
                different = 0;
            }
            j = j + 1;
        }
        i = i + 1;
    }
    return different;
}

3 个答案:

答案 0 :(得分:0)

你的代码有很多错误。 你为什么在strlen()打电话给while()?每次都会执行它,直到循环没有退出并且会降低性能。

此外,变量different未使用值1进行初始化,那么您如何确定该变量的初始值?

我还试图简化你的功能,还有优化的余地:

int meme(char s1[], char s2[])
{
    int i = 0;
    int different;
    int str1_len = strlen(s1);
    int str2_len = strlen(s2);

    if(str1_len > str2_len)
        str1_len = str2_len;

        do{
            if(s1[i] == s2[i])
            {
                printf("Common\n");
                different = 0;
            }
            else
            {
                different = 1;
            }
            i++;
        }while(str1_len--); 
    return different;
}

答案 1 :(得分:0)

  1. 你必须初始化different,因为它是未定义的,如果不是 - 这可能会破坏你的第一个while循环,因为different可能是一个随机数&gt; 1。
  2. strlen为您提供字符串中的字符数,不包括终止字符串的空字符(请参阅here)。但是,您不仅要比较两个字符串的字符,还要比较空字符,可能会隐含地检查字符串的长度是否相同。虽然这应该有效,但最好先通过比较字符串的长度来明确地进行检查,因为它更不容易出错。
  3. 如果先比较字符串的长度,则无需在此处执行嵌套循环。此外,您现在知道两个字符串的长度,因此可以更改此函数以使用for循环,这样可以更简单。
  4. 基于以上几点的可能解决方案:

    #include <stdio.h>
    #include <string.h>
    
    int meme(char s1[], char s2[]){
        int i = 0;
        int len_s1 = 0;
        int len_s2 = 0;
        int different = 0;
    
        len_s1 = strlen(s1);
        len_s2 = strlen(s2);
        if (len_s1 == len_s2) {
            for (i = 0 ; i < len_s1 ; i++) {
               if (s1[i] != s2[i]) {
                  different = 1;
                  break;
            }
        }
        else {
            different = 1;
        }
    
        return different;
    }
    

    还有一件事 - 做好自己和其他人的帮助并打算使用你的代码,否则很难阅读!

答案 2 :(得分:0)

您的代码未经过优化,并且您没有使用好的方法来执行此任务。我修改了代码,它将以最小化复杂度来完成工作。

这里我假设数组的大小与

一样

bool meme(char s1[], char s2[])
{
    int i=0;
    while(s1[i] != NULL && s2[i] != NULL)
    {
        if(s1[i] == s2[i])
            return false;
        i += 1;
    }
    return true;
}

当你调用这个函数然后声明一个 bool 类型的变量,并将该函数的返回值存储在该变量中。

例如:

bool check;
bool = meme(array 1 , array 2);

然后检查返回的值是否为 true ,然后两个数组完全不同。您可以通过以下代码执行此操作:

if(check)
    printf("Arrays are different");
else
    printf("Arrays are not different");

如果它更适合你,你也可以使用int代替bool但是记住,无论你编写什么代码,都必须最简单。并且认为如果你使用int,那么你只返回 0或1 ;但 int在32位编译器中占用2个字节,在64位编译器中占用4个字节,但 bool在某些语言中仅占用1个字节甚至1个字符,如pascal (如果我没错。)

并且不要与return true;return false;混淆。 True表示1,false表示0 布尔类型变量只能存储二进制数(1或0)