繁体   English   中英

C缓冲区溢出

[英]C buffer overflow

我试图创建一个函数,用str2替换文本t出现的所有str1 ,但我不断收到“缓冲区溢出”错误消息。 你能告诉我我的功能有什么问题吗?

#include <stdio.h>
#include <string.h>
#include <assert.h>

//replace all *str1 in *t with *str2, put the result in *x, return *x
char * result(char *str1,char *str2,char *t)
{
    char *x=NULL,*p=t,*r=t;
    x=malloc(400*sizeof(char));
    assert(x!=NULL);
    x[0]='\0';
    r=strstr(t,str1); //r is at the first occurrence of str1 in t, p is at the beginning of t
    while(r!=NULL)
    {
        strncat(x,p,r-p); //copy r-p chars from p to x
        strcat(x,str2); //copy str2 to x
        p=r+strlen(str1); //p will be at the first char after the last occurrence of str1 in t
        r=strstr(r+strlen(str1),str1); //r goes to the next occurrence of str1 in t
    }
    strcat(x,p);
    return x;
}

我没有使用gets()函数来读取任何char数组。

我的编译器是gcc版本4.6.3


我更新了代码,它可以工作,但结果不符合预期。

main()函数:

int main(void)
{
    char *sir="ab",*sir2="xyz",*text="cabwnab4jkab",*final;
    final=result(sir,sir2,text);
    puts(final);
    free(final);
    return 0;
}

打印字符串:

b

我期待cxyzwnxyz4jkxyz

看起来你的strncpy参数混淆了:第二个参数是字符串,而不是要复制的字符数限制,这应该是第三个参数:

 strncpy(x, p, r - p); // copy r - p chars from p to x

此外,您希望使用strcat而不是strcpy 使用strcpy ,每次strcpy用替换字符串覆盖结果的内容。 使用strcat ,确保在开始之前使用\\0初始化结果。

最后,您将从函数返回对局部变量x的引用:您无法执行此操作,因为函数返回后内存不可用。

您的代码包含许多奇怪的错误。

首先, x是指向目标缓冲区的指针。 因为你正在将所有的拷贝直接复制到x ,即所有内容都被复制到缓冲区的最开头,覆盖以前复制的数据。 这根本没有任何意义。 你在做这个吗? 您需要创建一个专用指针,将当前目标位置保持在x并将数据写入该位置(而不是将其写入x )。

我看到您编辑了代码并用连接替换了复制。 嗯......即使它可能解决问题,这仍然是糟糕的设计。 strcat / strncat函数没有好的C代码。 无论如何,你的代码仍然被破坏,因为你试图在未初始化的缓冲区x上使用strcat函数。 您需要先将x初始化为空字符串。

其次,搜索替换字符串会有一个更微妙的问题。 在循环结束时,你继续从下一个符号r=strstr(r+1,str1)搜索,即你只将搜索位置增加1.我不确定这是你想要的。

考虑aaaa作为输入文本,以及用bc替换aa的请求。 在这种情况下,您想要做多少次更换? aaaa中有多少次出现aa 2或3? 如果你想得到bcbc作为结果(2个替换),你必须通过strlen(str1)而不是1来增加r

实际上,在当前实现中,您设置p=r+strlen(str1) ,但继续从r+1位置搜索。 这将导致搜索字符串重叠出现完全无意义的结果,如我的示例所示。 尝试这个

char *str1="aa",*str2="xyz",*text="aaaa",*final;
final=result(str1,str2,text);

看看会发生什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM