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

时间:2016-03-09 11:13:08

标签: c recursion c-strings

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

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] = '\0';
     i = 0;
     char ch1;
     while (ch1 != '\n'){
     ch1 = getchar();
     str2[i] = ch1;
     i++;
     }
     str2[i] = '\0';
     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);
     }

案例1: 该实施适用于: str1 =“Mediolan” str2 =“MMediolan”

它返回1,这是正确的。

案例2: 但它不适用于: str1 =“Mediolan” str2 =“Mediolana”

返回-1。

我被困在这里并且不知道如何重写代码,因此案例2将得到正确的处理。

1 个答案:

答案 0 :(得分:2)

首先,这是错误的

 char *str1 = (char*) malloc (strlen(str1)*sizeof(char));
 char *str2 = (char*) malloc (strlen(str2)*sizeof(char));
你在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] = '\0';

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

    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);
}