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);
}
任务要求首先确定字符串 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);
}