我试图重新编码相当于strstr()
函数,经过几次尝试,我得到了正确的,这里的代码:
(我知道有更简单的方法来做到这一点,我做了,但这次我想尝试使用第三个字符串来存储发生)
char *my_strstr(char *s1, char *s2)
{
int i, j;
char *tmp;
i = (j = 0);
if (s1 != ' ' && s2 != ' ')
{
while (s1[i] != ' ' && s2[j] != ' ')
{
if (s1[i] == s2[j])
{
tmp[j] = s1[i];
j++;
}
i++;
}
printf("tmp = %sn", tmp);
}
return (tmp);
}
int main()
{
char a[] = "test Point123";
char b[] = "Point123";
char *ret;
ret = my_strstr(a, b);
printf("ret = %sn",ret);
return (0);
}
我得到了我想要的输出:
tmp = Point123
ret = Point123
但是为了确保,我尝试了一个更长的字符串,这就是问题开始的地方。这里是我尝试的字符串
char a[] = "test Point123456789";
char b[] = "Point123456789";
和我得到的输出:
tmp = Point123456?"1
ret = Point123456?"1
Abort trap: 6
与较长的字符串,我得到有时段错误,有时总线错误10。在其他一些帖子上,我发现总线错误10有时会取代mac OS上的段错误(我第一次在上面编码,我习惯在linux上编码),我没有发现任何关于陷阱的信息。
无论如何,我认为它更多的代码问题,我的编译器和我想知道为什么我的代码功能在较小的字符串,而不是更大的,我读到,它可能是我如何影响值到我使用的字符串,但我不明白我在哪里犯了错误。
所以如果有人能给我一个线索,我做错了,我将非常感激:)
编辑
我遵循了评论中的建议,这是我修复后的函数,现在运行良好,谢谢。
(再一次,我知道我不需要tmp,还有许多其他更简单和更快的方法来完成它-这是作为训练(显然我需要^^))
char *my_strstr(char *s1, char *s2)
{
int i, j;
char *tmp;
i = (j = 0);
tmp = malloc(sizeof(strlen(s2)));
if (s1 != ' ' && s2 != ' ')
{
while (s1[i] != ' ' && s2[j] != ' ')
{
if (s1[i] == s2[j])
{
tmp[j] = s1[i];
j++;
}
else
j = 0;
i++;
}
}
return (tmp);
}
在您的代码中,tmp
是函数my_strstr()
的自动局部变量。它没有显式初始化,因此它包含不确定的值。
tmp[j] = s1[i];
使用(解引用)tmp
未初始化意味着您正在尝试访问无效的内存位置(还记得"不确定值"吗?),这可能无法从您的应用程序访问。它会调用未定义的行为。
解决方案:您需要在访问(解引用)tmp
之前分配内存给它。
编辑:
然而,根据下面Vlad先生的评论,你的my_strstr()
逻辑也有问题。一旦增加j
(搜索字符串的索引)并发现两者之间的不匹配,就不能将其重新设置为0
。
您没有为tmp
分配内存,因此对于tmp[j]
,您正在写入一些未分配给您的随机内存位置。然后,这个位置可能会被您所做的事情再次覆盖。
字符串越长,占用的内存位置就越多。
你只是幸运地得到了一些较短字符串的结果。