1

私は大学で C コースを行っていますが、次のコード (再帰) を取得できないため、まだ Java に固執していると思います。

#include <stdio.h>
#include <conio.h>
#define N 11

int Combination(char *, char *, char *);
void main(){
int i;
char *S1[]={"","abc","abc","abc","abc","ab c","morning Venm","ABZ","12189","12189",      
    "TTTT"},

     *S2[]={"", "", "def", "def", "def", "def", "Good ita!", "ABAXZ", "129", "129", 
     "X"},

     *S3[]={"", "abc", "abcdef", "daebcf", "adfbce", "deab cf","Good morning Vietnam!",
            "ABAXABZZ", "12181299", "12112998", "XXXXX"};

for(i=0;i<N;i++){
    if(Combination(S1[i],S2[i],S3[i])) 
         printf("S1: \"%s\", S2: \"%s\", S3: \"%s\", 
         Combination!\n",S1[i],S2[i],S3[i]);
    else printf("S1: \"%s\", S2: \"%s\", S3: \"%s\", Not a 
         Combination!\n",S1[i],S2[i],S3[i]);

}

_getch();
}

/*Function name : Combination
  Input : address of three strings
  Output : true(1) if the third string is a combination of the two firsts strings,    
          false (0) if not
  Algorithm : check if the third string is made from the letters of the first and  
              second strings*/
int Combination(char *S1, char *S2, char *S3)
{
    if(!*S1 && !*S2 && !*S3) return 1;
    if(*S3==*S1 && *S3==*S2)
        return (Combination(S1+1,S2,S3+1)||Combination(S1,S2+1,S3+1));
    if(*S3==*S1) return Combination(S1+1,S2,S3+1);
    if(*S3==*S2) return Combination(S1,S2+1,S3+1);
    return 0;
}

Combination メソッドの任意の行を理解したい。

1) if(!*S1 && !*S2 && !*S3) = 3 つの文字列が null かどうかを確認しますか?

2) (S1+1,S2,S3+1) のどの部分ですか? S1+1 は、配列の次の単語または次の文字 ? を返します。それが次の手紙を私たちに与えるなら - 何のために?文字列が等しいかどうかはすでにチェックされていますか?

よくわかりません...

  • 再帰を取得しましたが、S1+1\S2+1\S3+1 の部分ではありません...
4

4 に答える 4

2

*S1 は文字列 S1 の最初の文字なので、

if (!*S1 && !*S2 && !*S3) 

3 つの文字列すべての最初の文字が null であるかどうかを確認しています。これは、それらがすべて空の文字列であることを意味します。

S1+1 は、事実上、最初の文字が削除された文字列 S1 です。文字列は、最初の文字へのポインターを渡すことによって、C で渡されます。S1+1 を渡すと、文字列の先頭が 1 文字下に移動します。

于 2012-07-05T13:57:08.803 に答える
0

パート 2) に関しては、S1 + 1 は、次の文字ではなく、次の文字列のアドレスを示します。次の文字は (*S1) + 1 になります。

于 2012-07-05T14:01:02.840 に答える
0
if (!*S1)

S1が空の C 文字列かどうかを確認します。

S1+1

の部分文字列の種類S1。IfS1は へのポインタです。 "abc"thenS1+1は へのポインタ"bc"です。

編集:それは、関数に渡される引数のように、S1へのポインタであると仮定しています:charCombination

...(char *S1, ...

他の回答のいくつかは、あなたの関数のように、それS1がへのポインタの配列であると仮定しているようです:charmain

char *S1[] = ...

おそらく、それらに異なる名前を付ける必要があります。

于 2012-07-05T14:05:06.423 に答える
0

1) if(!*S1 && !*S2 && !*S3) = 3 つの文字列が null かどうかを確認しますか?

すべての文字ポインタが文字列の最後に来るかどうか (つまり、null かどうか) をチェックするために使用されます。すべてが終了した場合は 1 を返します。

2) (S1+1,S2,S3+1) のどの部分ですか? S1+1 は、配列の次の単語または次の文字 ? を返します。

それは私たちに次のキャラクターを与えます。

それが次の手紙を私たちに与えるなら - 何のために?文字列が等しいかどうかはすでにチェックされていますか?

次の文字の組み合わせをチェックします。

于 2012-07-05T14:05:38.077 に答える