2017-04-17 6 views
-1

このコードを試しましたが、動作していないように見えます。2つの配列が完全に異なる場合は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

開始すると異なる初期化されませんでした - したがってyrループはおそらく実行されません – pm100

+1

'different'は未定義です。ところで、あなたのユースケースのために 'for'ループを使う方が良いでしょう。 – RoiHatam

答えて

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; 
} 
0
  1. それが定義されていない場合ではないとあなたがdifferentを初期化する必要があります - これはおそらく、おそらくdifferentとして、あなたの最初のwhileループを破ります
  2. strlenは、文字列を終了するヌル文字を除いた文字数を返します(here参照)。しかし、2つの文字列の文字だけでなく、ヌル文字も比較するだけでなく、おそらく文字列の長さが同じかどうかを暗黙的に調べることができます。これがうまくいくはずですが、このチェックはエラーの起こりにくい文字列の長さを最初に比較することによって明示的に行う方がよいでしょう。
  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は、パスカル(私が間違っていない場合)のような言語ではわずか1バイト、さらには1ビットしかかかりません。

return true;return false;と混同しないでください。 真は単に1を意味し、偽は0を意味します。そしてブール型型変数は、バイナリ番号(1または0)のみを格納できます。

関連する問題