C - 子字符串在字符串中的递归位置

C - position of substring in string recursively

任务要求首先确定字符串 str1 是否是 str2 的子字符串。如果是,则返回 str1 在 str2 中的起始位置。

int instring (char *str1, char *str2);
void main () {
     char *str1 = (char*) malloc (strlen(str1)*sizeof(char));
     char *str2 = (char*) malloc (strlen(str2)*sizeof(char));
     char ch;
     int i = 0;
     while (ch != '\n'){
         ch = getchar();
         str1[i] = ch;
         i++;
     }
     str1[i] = '[=10=]';
     i = 0;
     char ch1;
     while (ch1 != '\n'){
     ch1 = getchar();
     str2[i] = ch1;
     i++;
     }
     str2[i] = '[=10=]';
     printf("%d", instring(str1, str2));
     return 0;
 }
 int instring(char *str1, char *str2){
     int r;
     if(*str1==0) return(0);
     if(*str2==0) return -1;
     if(*str1==*str2 && instring(str1+1,str2+1)==0) return(0);
     r=instring(str1,str2+1);
     if(r!=-1) return(r+1);
     }

案例一: 该实施适用于: str1 = "Mediolan" str2 = "MMediolan"

是returns1,正确。

案例二: 但是它不适用于: str1 = "Mediolan" str2 = "Mediolana"

它returns-1.

我卡在这里,不知道如何重写代码,所以案例 2 将得到正确处理。

一开始这是错误的

 char *str1 = (char*) malloc (strlen(str1)*sizeof(char));
 char *str2 = (char*) malloc (strlen(str2)*sizeof(char));

whish str1 你指的是 strlen 吗?

此外,您从未在下面初始化 ch1

char ch1;
while (ch1 != '\n'){

你不应该读取你没有初始化的变量的值。 ch.

相同

也许你想试试这个版本(我这边好像行得通):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXLEN 200

int instring (char *str1, char *str2);

int main (void) 
{

    char *str1, *str2;
    int ch = 0;
    int i = 0;

    str1 =  malloc (MAXLEN);
    if(str1 == NULL) return 1;
    str2 =  malloc (MAXLEN);
    if(str2 == NULL) {free(str1); return 1;}

    while((ch = getchar()) != EOF && ch != '\n')
    {
        str1[i] = (char) ch;
        i++;
    }
    str1[i] = '[=12=]';

    i = 0;
    while((ch = getchar()) != EOF && ch != '\n')
    {
        str2[i] = (char) ch;
        i++;
    }
    str2[i] = '[=12=]';

    printf("%d", instring(str1, str2));
    free(str1); free(str2);
    return 0;
}

int instring(char *str1, char *str2)
{
    int r = 0;
    if(*str1 == 0) return 0; 
    if(*str2 == 0) return -1;
    if(*str1 == *str2 && instring(str1 + 1, str2 + 1) == 0) return 0;
    r = instring(str1, str2 + 1);
    if(r != -1) return (r + 1);
}