编写一个函数string_in(char *str1,char *str2),如果字符串str1包含字符串str2,则返回数值1,否则返回数值2,内存提示出错啊

asd168971681111 2012-01-09 04:25:58
//编写一个函数string_in(char *str1,char *str2),如果字符串str1包含字符串str2,则返回数值1,否则返回数值2,还是内存提示出错啊
#include"stdio.h"
#include"string.h"
int string_in(char* str1,char* str2){
int p,l2;
l2=strlen(str2); //把字符串2的长度赋给l2
if(*str2) // s2 第一个字符不是空 进行下面的操作
while(*str1) // s1 不是结束符作为循环条件
{if(*str1==*str2) //字符串1和字符串2第一个字符相比,如果相等,做下面的运算
{
for(p=0;*(str1+p)==*(str2+p);p++) //s1 s2 从第一个字符开始比较并同时往下移一个字符
{while(p>=(l2-1)) //当p自增到把s2跑完的时候,则表示字符串1包含字符串2
return 1; //返回1
}

}
else if(*str1!=='\n') str1++; //str1自增,使其找到与str2字符串首字符的字符。
else return 2 ; //当str1自增到结束的时候,他里面都没有字符串与str1相等,那就返回2

}
}
int main(){
char* str1;
char* str2;
int flag=1,a;
while(flag==1){
printf("imput string1 :\n");
gets(str1);
printf("imput string2 :\n");
gets(str2);
if(strlen(str1)<strlen(str2))
{flag=1;
printf("字符串1比字符串2多才对!");}
else flag=0;
}
a=string_in(str1,str2);
printf("%d",a);



}

...全文
747 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
asd168971681111 2012-01-10
  • 打赏
  • 举报
回复
谢谢楼上各位,问题已经得到解决了,呵呵
zkvae 2012-01-09
  • 打赏
  • 举报
回复
晕死。上面想把注释字体颜色用红色表示的,又没搞好
面包大师 2012-01-09
  • 打赏
  • 举报
回复

for(p=0;*(str1+i+p)==*(str2+p);p++)
{
if(p>=(l2-1))
return 1;
}
i++;
}
else
i++;
}
return 2;

顺便把代码给你修改好了,发给你
zkvae 2012-01-09
  • 打赏
  • 举报
回复
你的代码有几处错误,改动如下:

#include"stdio.h"
#include"string.h"
int string_in(char* str1,char* str2)
{
int p,l2;
l2=strlen(str2); //把字符串2的长度赋给l2
if(*str2) // s2 第一个字符不是空 进行下面的操作
{
while(*str1) // s1 不是结束符作为循环条件
{
if(*str1==*str2) //字符串1和字符串2第一个字符相比,如果相等,做下面的运算
{
for(p=0;*(str1+p)==*(str2+p);p++) //s1 s2 从第一个字符开始比较并同时往下移一个字符
{
if(p>=(l2-1)) //这个地方应该是if吧?
return 1; //返回1
}

}
else if(*str1 !='\n') str1++; //str1自增,使其找到与str2字符串首字符的字符。
else return 2 ; //当str1自增到结束的时候,他里面都没有字符串与str1相等,那就返回2

}
}
return 2;//要加上这句,否则这个执行路径没有返回值,会返回不确定的值
}
void main(){//main函数要么返回类型为void,要么你在最后也要返回一个值
char* str1 = new char[100] ;//根据1楼提示 char* str2 = new char[100];
int flag=1,a;
while(flag==1){
printf("imput string1 :\n");
gets(str1);
printf("imput string2 :\n");
gets(str2);
if(strlen(str1)<strlen(str2))
{flag=1;
printf("字符串1比字符串2多才对!");}
else flag=0;
}
a=string_in(str1,str2);
delete str1;//根据1楼的提示delete
delete str2;
printf("%d",a);
}

面包大师 2012-01-09
  • 打赏
  • 举报
回复

int p,l2,i=0;
l2=strlen(str2);
if(*str2)
while(*(str1+i)!='\0')
{
if(*(str1+i)==*str2)
{

gqjjqg 2012-01-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 asd168971681111 的回复:]
引用 1 楼 ivers0n 的回复:
没看到你申请为str1 str2申请空间;

char* str1=new char[100];
char* str2=new char[100];

memset(str1,0,100);
memset(str2,0,100);

最后记得delete

我想问下,指针没有分配空间,另外我问了些其他论坛,也有人是说没分配空间
#in……
[/Quote]

编译器不会给你检查是否分配内存,分配多少的,编译成功只能说你语法没错。
面包大师 2012-01-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 asd168971681111 的回复:]

我想问下,指针没有分配空间,另外我问了些其他论坛,也有人是说没分配空间
#i……
[/Quote]
编译的过不一定是正确的
独自听枫 2012-01-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhao4zhong1 的回复:]

C/C++ code
#include <string.h>
int string_in(char *str1,char *str2) {
if (strstr(str1,str2)) return 1; else return 2;
}
[/Quote]
+++
asd168971681111 2012-01-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ivers0n 的回复:]
没看到你申请为str1 str2申请空间;

char* str1=new char[100];
char* str2=new char[100];

memset(str1,0,100);
memset(str2,0,100);

最后记得delete
[/Quote]
我想问下,指针没有分配空间,另外我问了些其他论坛,也有人是说没分配空间
#include"stdio.h"
int main(){
char *a;
gets(a);
printf("%s",a);
}这个编译通过
又怎么理解啊

czl0325 2012-01-09
  • 打赏
  • 举报
回复
string_in(char *str1,char *str2)
{
CString str = (CString)str1;
if(str.Find(str2)) return 1;
else return 2;
}
编程点滴 2012-01-09
  • 打赏
  • 举报
回复
改完记得可用kmp算法做个改进
赵4老师 2012-01-09
  • 打赏
  • 举报
回复
#include <string.h>
int string_in(char *str1,char *str2) {
if (strstr(str1,str2)) return 1; else return 2;
}
面包大师 2012-01-09
  • 打赏
  • 举报
回复
首先

char str1[128] = {0};
char str2[128] = {0};
尘缘udbwcso 2012-01-09
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <malloc.h>
#include <string.h>
void getNextval(char *subStr, int *nextval, int length)
{
int i = 0, j = -1;
nextval[0] = -1;
while(i < length - 1)
{
if(j <= 0 || subStr[i] == subStr[j])
{
++i;
++j;
if(subStr[i] != subStr[j])
nextval[i] = j;
else
nextval[i] = nextval[j];
}
else
j = nextval[j];
}
}
int kmp(char *str, char *subStr)
{
int strLen = strlen(str);
int subStrLen = strlen(subStr);
int *nextval = (int*)malloc(sizeof(int)*subStrLen);
int i = -1, j = -1;
getNextval(subStr, nextval, subStrLen);
while(i < strLen && j < subStrLen)
{
if(j < 0 || str[i] == subStr[j])
{
++i;
++j;
}
else
j = nextval[j];

}
free(nextval);
if(j >= subStrLen)
return i - subStrLen;
return -1;
}
int main()
{
char str[] = "acabaabaabcacaabc";
char subStr[] = "abaab";
//printf("\n%d\n", kmp(str, subStr));
if(kmp(str, subStr) == -1)
printf("2\n");
else
printf("1\n");
return 0;
}

bdmh 2012-01-09
  • 打赏
  • 举报
回复
自己调试吧,崩溃肯定是地址访问错了,看看指针是否越界了
IVERS0N 2012-01-09
  • 打赏
  • 举报
回复
没看到你申请为str1 str2申请空间;

char* str1=new char[100];
char* str2=new char[100];

memset(str1,0,100);
memset(str2,0,100);

最后记得delete



69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧