2012-07-05 105 views
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; 
} 

我想要了解组合方法的任何一行。

1)如果(!* S1 & &!* S2 & &!* S3)=该检查,如果3个字符串是空?

2)什么部分:(S1 + 1,S2,S3 + 1) - 做什么? S1 + 1会给我们阵列中的下一个单词,或者它会给出下一个字母?如果它会给我们下一封信 - 为什么?如果字符串相同,它已经被拒绝了吗?

我很困惑...

  • 我得到了递归,但不S1 + 1 \ S2 + 1 \ S3 + 1的一部分...

回答

2

* S1是串S1的第一个字符,所以

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

正在检查,看看是否所有三个字符串的第一个字符是空的,这意味着它们都是空字符串。

S1 + 1实际上是字符串S1,第一个字符被删除。通过将指针传递给第一个字符,字符串在C中传递。通过传递S1 + 1,字符串的开头向下移动一个字符。

+0

我想你解决了我的问题。因为我确信* S1 = S1 [N]的单词。但如果我理解正确 - S [N] ---> * S1 = S [N]的第一个字母?好的...现在我会再看代码。 – Oshrib 2012-07-05 13:59:33

+0

编辑完成后 - s1 + 1就像s1.substring(1)在JAVA中一样? – Oshrib 2012-07-05 14:03:07

+0

@Bside:没错! – 2012-07-05 14:04:41

0

至于部分2),S1 + 1会给你下一个字符串的地址,而不是下一个字符。下一个字符是(* S1)+ 1

+0

如果我理解你 - 所以你的回答与@Vaughn Cato的答案相抵触 – Oshrib 2012-07-05 14:03:45

+1

'下一个字符将是(* S1)+ 1。“这是不正确的。 *(S + 1)会给出下一个字符,而(* S)+1会给字符加'1'。例如,如果S是“axz”,那么* S + 1将是'b'。 – 2012-07-05 14:11:24

+1

道歉KingsIndian,我指的是代码第一部分中提出的约定,其中S1是一个char *数组。如果您将S1指定为char *,那么您是正确的。 Bside,如果考虑到代码中存在的不同约定,我们的答案并不矛盾。 – 2012-07-05 14:26:24

0
if (!*S1) 

检查S1是一个空的C-字符串。

S1+1 

类型的子串S1。如果S1是指向​​的指针,则S1+1是指向"bc"的指针。

编辑: 这是假设S1是一个指向char,像传递给Combination函数的参数:

...(char *S1, ... 

一些其他的答案似乎认为S1是一个指针数组char ,就像你main功能:

char *S1[] = ... 

你或许应该给予他们不同的n埃姆斯。

0

1)如果(!* S1 & &!* S2 & &!* S3)=该检查,如果3个字符串是空?

它用于检查所有字符指针是否到达字符串末尾(即)是否为空。如果全部到达它将返回1.

2)什么部分:(S1 + 1,S2,S3 + 1) - 做了什么? S1 + 1会给我们阵列中的下一个单词,或者它会给出下一个字母?

它会给我们下一个字符。

如果它会给我们下一封信 - 为什么?如果字符串相同,它已经被拒绝了吗?

检查下一个字符的组合。