2017-04-17 70 views
-1

我試過這段代碼,但它似乎沒有工作,如何擺脫嵌套循環?函數返回1,如果兩個數組完全不同,如果有一個公共元素,則返回0

#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; 
} 
+0

你是否嘗試用調試器逐步調試代碼? – pm100

+3

一開始你沒有初始化不同 - 所以你的循環可能永遠不會運行 – pm100

+1

'不同'是未定義的。順便說一句,爲你的用例使用'for'循環會更好 – RoiHatam

回答

0

你的代碼有太多錯誤。 你爲什麼在while()打電話strlen()?每次都會執行,直到循環不退出,並且會降低性能。

此外變量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; 
} 
0
  1. 您必須初始化different,因爲它是不確定的,如果不是 - 這可能傷了你的第一while循環different可能是一個隨機數> 1.
  2. strlen爲您提供了字符串中不包括終止字符串的空字符的字符數(請參閱here)。但是,不僅要比較兩個字符串的字符,還要比較空字符,可能會隱式檢查字符串的長度是否相同。雖然這應該起作用,但最好通過首先比較字符串的長度來明確檢查,因爲它不太容易出錯。
  3. 如果首先比較字符串的長度,則不需要在此處執行嵌套循環。此外,您現在知道兩個字符串的長度,因此可以更改此函數以使用for循環,這使得它更簡單。

基於上述各點一個可能的解決方案:

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

一兩件事 - 做自己和其他人的忙,並打算你的代碼,因爲它是非常難讀,否則!

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 check; 
bool = meme(array 1 , array 2); 

,然後檢查返回值是,則兩個數組是完全不同的其他人沒有。你可以通過下面的代碼:

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

您也可以使用int代替布爾的,如果它適合你更好,但要記住,你寫任何代碼,必須是最不復雜的。並認爲如果你使用int,那麼你也只返回0或1;但是int在32位編譯器中需要2個字節,在64位編譯器中需要4個字節,但bool在某些語言(如pascal(如果我沒有錯))中只需要1個字節甚至1個位。

並且不要與return true;return false;混淆。 真簡單的意思是1而虛假的意思是0。而一個布爾型類型變量只能存儲二進制數(1或0)

相關問題