关于动态内存,不知道错在哪里,请教

greatinghk 2008-05-22 09:20:10
#include <stdio.h>
//put 2 string
//find the str1 for str2
//return addrss of str2 in the str1
char *findstr(const char *str1,const char *str2)
{
int len1,len2;
len1=strlen(str1);
len2=strlen(str2);
if(len1<len2||len2==0) return NULL;
//-------------------
int i,j;
char *p1,*p2;
p1=str1;
p2=str2;
int key=0;

for(i=0;i<len1-len2;i++)
{
for(j=0;j<len2;j++)
{
if(p1[i]==p2[j]) key=1;
else {key=0;break;}
}
if(key==1) break;
}
--i;
if(key==1) return &p1[i];
else return NULL;
}

char *getstring(char *str)
{
int slong;
str=malloc((sizeof(char)*50)+1);
slong=sizeof(str);
fgets(str,50,stdin);
slong=sizeof(str);
str=realloc(str,slong);
return str;
}

int main ()
{
char *string1,*string2;
char *endstr;
printf("input string 1 :");
string1 = getstring(string1);
printf("input string 2 :");
string2 = getstring(string2);
endstr=findstr(string1,string2);
printf("%s\n",endstr);


return 0;
}
...全文
94 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
greatinghk 2008-05-22
  • 打赏
  • 举报
回复
感谢 ugvihc 给的很详细。
原来,for循环时用break结束时,i、不在自加

还有个疑问,fgets()函数,说明是自动添加'\0' ,为什么不添加呢,调试时跟踪时发现是指 '\n',这是为什么,是我理解错了么
ugvihc 2008-05-22
  • 打赏
  • 举报
回复
#include <stdio.h>
//put 2 string
//find the str1 for str2
//return addrss of str2 in the str1
char *findstr(const char *str1,const char *str2)
{
int len1,len2;
len1=strlen(str1);
len2=strlen(str2);
if(len1 <len2 ||len2==0) return NULL;
//-------------------
int i,j;
char *p1,*p2;
p1=str1;
p2=str2;
int key=0;

for(i=0;i <len1-len2;i++)
{
for(j=0;j <len2;j++)
{
if(p1[i+j]==p2[j]) /* 字符串匹配p1也需要递加 ×/
{
key=1;
}
else
{
key=0;
break;
}
}
if(key==1) break;
}
/× 返回时,i不需要减1 ×/
if(key==1)
return &p1[i];
else
return NULL;
}

char *getstring(char *str)
{
int slong;
str=malloc((sizeof(char)*50)+1);
slong=strlen(str); /× sizeof 得到的是指针的大小,一般是4 ×/
fgets(str,50,stdin);
slong=strlen(str); /× sizeof 得到的是指针的大小,一般是4 ×/
str[slong-1] = '\0'; /× 应该最后一个字符赋字符串结束标记 '\0' */
str=realloc(str,slong);
return str;
}

int main ()
{
char *string1,*string2;
char *endstr;
printf("input string 1 :");
string1 = getstring(string1);
printf("input string 2 :");
string2 = getstring(string2);
endstr=findstr(string1,string2);
printf("%s\n",endstr);


return 0;
}
baiguang06 2008-05-22
  • 打赏
  • 举报
回复
char *getstring(char *str)
{
int slong;
str=(char*)malloc((sizeof(char)*50)+1);
slong=sizeof(str);
fgets(str,50,stdin);
slong=sizeof(str);
str=(char*)realloc(str,slong);
return str;
}
这个函数
str这个值在返回前不会丢吗?会不会返回一个野指针呢?
Cocoky 2008-05-22
  • 打赏
  • 举报
回复
有什么问题?都没说清楚。
brookmill 2008-05-22
  • 打赏
  • 举报
回复
slong=strlen(str)+1;
cppscript 2008-05-22
  • 打赏
  • 举报
回复
正解
brookmill 2008-05-22
  • 打赏
  • 举报
回复
slong=sizeof(str); /* sizeof(str) = 4 */
改成这样试试
str=malloc((sizeof(char)*50)+1);
fgets(str,50,stdin);
slong=strlen(str);
iu_81 2008-05-22
  • 打赏
  • 举报
回复
#include  <stdio.h> 
#include <string>

using namespace std;
//put 2 string
//find the str1 for str2
//return addrss of str2 in the str1
char *findstr(const char *str1,const char *str2)
{
int len1,len2;
len1=strlen(str1);
len2=strlen(str2);
if(len1 <len2 ||len2==0) return NULL;
//-------------------
int i,j;
char *p1,*p2;
p1=(char*)str1;
p2=(char*)str2;
int key=0;

for(i=0;i <len1-len2;i++)
{
for(j=0;j <len2;j++)
{
if(p1[i]==p2[j]) key=1;
else {key=0;break;}
}
if(key==1) break;
}
--i;
if(key==1) return &p1[i];
else return NULL;
}

char *getstring(char *str)
{
int slong;
str=(char*)malloc((sizeof(char)*50)+1);
slong=sizeof(str);
fgets(str,50,stdin);
slong=sizeof(str);
str=(char*)realloc(str,slong);
return str;
}

int main ()
{
char *string1,*string2;
char *endstr;
printf("input string 1 :");
string1 = getstring(string1);
printf("input string 2 :");
string2 = getstring(string2);
endstr=findstr(string1,string2);
printf("%s\n",endstr);


return 0;
}

69,371

社区成员

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

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