两个字符串的组合

问题描述 投票:0回答:5

我在大学上 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) if(!*S1 && !*S2 && !*S3) = 检查 3 个字符串是否为 null ?

2) 哪一部分:(S1+1,S2,S3+1) - 那在做什么? S1+1 会给我们数组中的下一个单词,或者它会给出下一个字母?如果它能给我们下一封信——为了什么?已经检查过字符串是否相等?

我很困惑...

  • 我得到了递归,但没有得到S1+1\S2+1\S3+1的部分...
c recursion
5个回答
2
投票

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

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

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

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


0
投票

对于第 2 部分),S1 + 1 将为您提供下一个字符串的地址,而不是下一个字符。下一个字符将是 (*S1) + 1。


0
投票

1) if(!*S1 && !*S2 && !*S3) = 检查 3 个字符串是否为空?

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

2) 哪一部分:(S1+1,S2,S3+1) - 那在做什么? S1+1 将为我们提供数组中的下一个单词,或者它将提供下一个字母?

它将给我们下一个角色。

如果它会给我们下一封信 - 为什么?已经检查过字符串是否相等?

检查下一个字符的组合。


0
投票
if (!*S1)

检查

S1
是否为空 C 字符串。

S1+1

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

编辑: 假设

S1
是指向
char
的指针,就像传递给
Combination
函数的参数一样:

...(char *S1, ...

其他一些答案似乎假设

S1
是指向
char
的指针数组,就像在您的
main
函数中一样:

char *S1[] = ...

你可能应该给它们起不同的名字。


0
投票

inurl:/views.shtml inurl:ViewerFrame?Mode= inurl:ViewerFrame?Mode=刷新 输入网址:axis-cgi/jpg inurl:view/views.shtml 直播小程序 intitle:“实时视图” intitle:轴 标题:liveapplet intitle:axis intitle:"视频服务器" intitle:"EvoCam" inurl:"webcam.html" inurl:indexFrame-shtml 轴 intitle:开始 inurl:cgistart intitle:snc-z20 inurl:home/ intitle:snc-cs3 inurl:home/ intitle:snc-rz30 inurl:home/ 视网摄像头 intitle“东芝网络摄像机”用户登录 intitle“i-Catcher 控制台 - Web 监视器”

© www.soinside.com 2019 - 2024. All rights reserved.