Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 检查主字符串中是否有子字符串,如果是,则从找到的子字符串开始打印主字符串_C_Arrays - Fatal编程技术网

C 检查主字符串中是否有子字符串,如果是,则从找到的子字符串开始打印主字符串

C 检查主字符串中是否有子字符串,如果是,则从找到的子字符串开始打印主字符串,c,arrays,C,Arrays,我有一个得到2个字符串的代码,它必须检查主字符串是否包含子字符串,如果包含子字符串,它将打印主字符串,但它将从子字符串的位置开始。例如,如果我的主字符串是“你好,我的名字是”,我的子字符串是“我的”,它将打印“我的名字是”作为新的主字符串 我有代码,它正在工作。但我很难理解它为什么会起作用。谁能解释一下这个函数是如何工作的吗 char *recursiveStrStr(char *str, char *substr); 尤其是这一行: return recursiveStrStr(str +

我有一个得到2个字符串的代码,它必须检查主字符串是否包含子字符串,如果包含子字符串,它将打印主字符串,但它将从子字符串的位置开始。例如,如果我的主字符串是“你好,我的名字是”,我的子字符串是“我的”,它将打印“我的名字是”作为新的主字符串

我有代码,它正在工作。但我很难理解它为什么会起作用。谁能解释一下这个函数是如何工作的吗

char *recursiveStrStr(char *str, char *substr);
尤其是这一行:

return recursiveStrStr(str + 1, substr);
代码如下:

#include <stdio.h>
#include <conio.h>

int recursiveHasPrefix(char *str, char *prefix);
char *recursiveStrStr(char *str, char *substr);

int main()
{

    char *str = "Yesterday all my troubles seemed so far away";
    char *subStr[6] = { "Yes", "all", "my", "see", "far", "day" };
    char *res;
    int i;
    printf("%s\n", str);
    res = str;
    for (i = 0; i < 6; i++)
    {
        printf("%s\n", subStr[i]);
        res = recursiveStrStr(res, subStr[i]);
        if (res == 0)
        {
            printf("The specified text is not found.\n");
            break;
        }
        else
            printf("The found text: %s\n", res);
    }
    getch();
    return 0;
}

int recursiveHasPrefix(char *str, char *prefix)
{
    if (*prefix == '\0')
        return 1;
    if (str[0] != prefix[0])
        return 0;
    return recursiveHasPrefix(str + 1, prefix + 1);

}

char *recursiveStrStr(char *str, char *substr)
{
    int check;
    if (*str == '\0' && *substr != '\0')
        return 0;

    check = recursiveHasPrefix(str, substr);
    if (check == 1)
        return str;

    return recursiveStrStr(str + 1, substr);

}
#包括
#包括
int recursiveHasPrefix(char*str,char*prefix);
char*recursiveStrStr(char*str,char*substr);
int main()
{
char*str=“昨天我所有的烦恼似乎都离我很远”;
char*subStr[6]={“是”、“全部”、“我的”、“看”、“远”、“天”};
字符*res;
int i;
printf(“%s\n”,str);
res=str;
对于(i=0;i<6;i++)
{
printf(“%s\n”,subStr[i]);
res=recursiveStrStr(res,subStr[i]);
如果(res==0)
{
printf(“找不到指定的文本。\n”);
打破
}
其他的
printf(“找到的文本:%s\n”,res);
}
getch();
返回0;
}
int recursiveHasPrefix(char*str,char*prefix)
{
如果(*前缀=='\0')
返回1;
if(str[0]!=前缀[0])
返回0;
返回递归hasPrefix(str+1,prefix+1);
}
char*recursiveStrStr(char*str,char*substr)
{
整数检查;
如果(*str='\0'&&&*substr!='\0')
返回0;
检查=递归hasPrefix(str,substr);
如果(检查==1)
返回str;
返回递归strstrstr(str+1,substr);
}

ABCDEFG
CDEF

输出: CDEFG


现在您将返回该点并打印。

到底是什么让人困惑?你能指出代码的某一部分吗?我们应该能够提供帮助,但这句话的措辞让它非常宽泛。为什么不使用
strstr
来查找子字符串呢?@Catalyst我现在开始理解它了。我忘记了第一个递归只检查前缀。不知何故,如果它是主字符串的子字符串而不是主字符串的前缀子字符串,我就把它与一般的founding混淆了。我相信在一两分钟内我会弄明白的。不需要在标题中添加“[已解决]”。您通过接受答案表明了这一点。无论答案是否已发布,您可能根本不应该添加“[已解决]”。如果你自己解决了问题,你可以发布并接受自己的答案。在标题中添加“[已解决]”是其他一些论坛的惯例;这里没有完成。(请看首页上的问题列表。)
Now what your program doing?

ABCDEFG CDEF ---> Is there any common prefix such that it's length=len(CDEF)=4
No so return 0

BCDEFG CDEF --> No

CDEFG CDEF --> matches ...then go to DEFG DEF ---> EFG EF --> FG F --> G . return 1.