C 实现strstr()函数时出错
我已经实现了strstr(),但代码无法运行。请帮助:C 实现strstr()函数时出错,c,C,我已经实现了strstr(),但代码无法运行。请帮助: #include<stdio.h> #include<conio.h> #include<stdlib.h> #include<string.h> char* mystrstr(char*,char*); int main() { char *s1,*s2,*flag; printf("Enter a string:\n "); gets(s1); printf
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
char* mystrstr(char*,char*);
int main()
{
char *s1,*s2,*flag;
printf("Enter a string:\n ");
gets(s1);
printf("Enter a word to find in it:\n");
gets(s2);
flag=mystrstr(s1,s2);
if(flag)
printf("Word found\n");
else
printf("Word not found");
getch();
return 0;
}
char* mystrstr(char* s1,char* s2)
{ int flag=0,j,i;
char* temp;
for(i=0;i<strlen(s1);i++)
{ if(*(s1+1)==s2[0])
{
for(j=1;*s2;j++)
{
if(*(s1+i)==*(s2+j))
flag=1;
else
flag=0;
}
}
}
if(flag)
{
temp=(char*)malloc(sizeof(char*));
itoa(j,temp,10);
return *temp;
}
return 0;
}
#包括
#包括
#包括
#包括
char*mystrstrstr(char*,char*);
int main()
{
字符*s1,*s2,*标志;
printf(“输入字符串:\n”);
获取(s1);
printf(“输入要在其中查找的单词:\n”);
获取(s2);
flag=mystrstrstr(s1,s2);
国际单项体育联合会(旗)
printf(“找到单词”);
其他的
printf(“未找到单词”);
getch();
返回0;
}
char*mystrstr(char*s1,char*s2)
{int flag=0,j,i;
字符*温度;
对于(i=0;i一些快速提示:
分配给指针或使用
阅读更多关于这里
阅读并思考这样做的算法或谷歌
更多信息,请具体阅读
一些快速提示:
分配给指针或使用
阅读更多关于这里
阅读并思考这样做的算法或谷歌
更多信息,请具体阅读
for(i=0;ifor(i=0;i对于初学者,您可能想了解“get”是如何工作的:
您只是在主方法的堆栈上声明指针。这些指针可能会指向一些随机内存。正如上面的注释所述,您必须使用“malloc”(s1=malloc(256);
)在堆上或使用f.ex在堆栈上分配内存。char s1[256]
”等,然后使用“get(&s1)”将地址传递给get;
”相反,对于初学者,您可能想了解“get”的工作原理:
您只是在主方法的堆栈上声明指针。这些指针可能会指向一些随机内存。正如上面的注释所述,您必须使用“malloc”(s1=malloc(256);
)在堆上或使用f.ex在堆栈上分配内存。char s1[256]然后用“get(&s1)”将地址传递给get;
”而不是conio.h
getch不是ansic
itoa不是ANSI C
您的函数返回一个字符串,该字符串包含s2中的positionnumber。是否适合您
返回必须被释放
你知道数组访问吗?比*(s2+j)
更好的是s2[j]
if(*(s1+1)==s2[0])
是否应该是if(*(s1+i)==s2[0])
(j=1;*s2;j++)的是否应该是(j=1;s2[j];j++)的呢
如果flag=0
缺少中断,请参阅其他答案。conio.h不是ANSI C
getch不是ansic
itoa不是ANSI C
您的函数返回一个字符串,该字符串包含s2中的positionnumber。是否适合您
返回必须被释放
你知道数组访问吗?比*(s2+j)
更好的是s2[j]
if(*(s1+1)==s2[0])
是否应该是if(*(s1+i)==s2[0])
(j=1;*s2;j++)的是否应该是(j=1;s2[j];j++)的呢
如果flag=0
缺少中断符,请参阅其他答案。是否检查了第一个字符
if(*(s1+1)==s2[0]) // you are checking s1[1] against s2[0]
这是无限循环,除非s2[0]首先是一个空字符,或者使用break从循环中断
for(j=1;*s2;j++)
一种可供您参考的重复方法:
char* my_strstr(char* s1, char* s2) {
// return null pointer for empty strings
if (strlen(s1) == 0 || strlen(s2) == 0)
return 0;
// recursive part
if (s1[0] == s2[0]) {
if (strlen(s2+1) == 0 || (strlen(s2+1) != 0 && my_strstr(s1+1, s2+1) == s1+1))
return s1;
}
else return 0;
}
你检查了第一个字符了吗
if(*(s1+1)==s2[0]) // you are checking s1[1] against s2[0]
这是无限循环,除非s2[0]首先是一个空字符,或者使用break从循环中断
for(j=1;*s2;j++)
一种可供您参考的重复方法:
char* my_strstr(char* s1, char* s2) {
// return null pointer for empty strings
if (strlen(s1) == 0 || strlen(s2) == 0)
return 0;
// recursive part
if (s1[0] == s2[0]) {
if (strlen(s2+1) == 0 || (strlen(s2+1) != 0 && my_strstr(s1+1, s2+1) == s1+1))
return s1;
}
else return 0;
}
实现strstr()的Java代码
类解决方案{
公共int strStr(串草垛、串针){
字符串res=“”;
int pos=0;
如果(针长度()==0){
返回0;
}
如果(干草堆等于(针)){
返回0;
}
如果(针.length()>haystack.length()| | haystack.length()==0){
返回-1;
}
for(inti=0;iJava代码来实现strstrstr()
类解决方案{
公共int strStr(串草垛、串针){
字符串res=“”;
int pos=0;
如果(针长度()==0){
返回0;
}
如果(干草堆等于(针)){
返回0;
}
如果(针.length()>haystack.length()| | haystack.length()==0){
返回-1;
}
对于It i=0;你面临的问题是什么?它不是按你想要的方式工作吗?非常糟糕的代码,考虑学习。你写的不是斯特拉斯,而是我的意图。把问题分解成步骤。我认为你是一个函数,但是你从代码中声明程序中的函数,看起来你在寻找S中的子串S1。TrsS2然后我不认为你的内部循环逻辑是正确的。你面临什么问题?它不是按你想要的方式工作吗?非常糟糕的代码,考虑学习。你写的不是斯特拉斯,而是我的意图。把问题分解成步骤。我认为你是一个函数,但是你从代码中声明程序中的函数。看起来您试图在字符串s2中查找子字符串s1,但我认为您的内部循环逻辑不正确。如果我因为不太了解c而做错了什么,请纠正我。如果我因为不太了解c而做错了什么,请纠正我。我的意思是您必须使用gets(&s1);如果您使用“char s1[256]”在堆栈上分配内存。使用指针和malloc时不是这样,那么您是正确的否。这与堆栈与malloced内存无关。如果是char foo[32],则get(&foo);是错误的;如果是char*foo=malloc(32),则是错误的;抱歉!您是正确的。我猜您必须编写get(&s1[0])如果你想要一个类似的效果=),我的意思是,如果你在堆栈上用“char s1[256]”分配内存,你就必须使用get(&s1);如果你在使用指针和malloc时不这样做,那么你是正确的否。这与堆栈与malloced内存无关。get(&foo);如果是char foo[32],那么它是错误的;如果是char*foo=malloc,那么它是错误的(32);很抱歉!你说得对。我想你得写封信了