[英]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.