C语言 如何在具有动态字符串的函数中使用 malloc,而不是在末尾添加符号



我正在尝试创建一个函数fib(n(,该函数将两个字符ab作为初始参数,然后为给定索引打印斐波那契数列的每个项n

该序列描述为:

S0=" "
S1="b"
S2="a"
Sn="S(n-1)S(n-2)"

例如,n=6的结果应该是:

"b","a","ab","aba",abaab","abaababa"...

我的问题是当我运行代码时,字符串会随机添加符号,如果删除这些符号,将给出所需的结果,我在任何地方都找不到原因。

当我运行代码并给n值 6 时,这是返回的结果

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void combine(char**s,char**ch1,char**ch2)
{
int size=strlen(*ch1)+strlen(*ch2);
free(*s);
*s=(char*)malloc(size*sizeof(char)+1);
strcpy(*s,*ch1);
strcat(*s,*ch2);
}
void replace(char**ch1,char**ch2)
{
free(*ch1);
*ch1=(char*)malloc(strlen(*ch2)*sizeof(char)+1);
strcpy(*ch1,*ch2);
}
void fib(int n)
{
char*a,*b,*s;
int i;
printf("S0 = ' 'n");
if(n>=1)
{   
printf("S1 = 'b'n");
if(n>=2)
{
printf("S2 = 'a'n");
if(n>2)
{
s=(char*)malloc(sizeof(char)+1);
b=(char*)malloc(sizeof(char)+1);b[0]='b';
a=(char*)malloc(sizeof(char)+1);a[0]='a';
for(i=3;i<=n;i++)
{
combine(&s,&a,&b);
printf("S%d = '%s'n",i,s);
replace(&b,&a);
replace(&a,&s);
}

}
}
}
}
int main()
{
int n;
char *a,*b,*s;
printf("Give the index at which to stop : ");
scanf("%d",&n);
fib(n);
}

在正确的 C 中执行此操作意味着转储 C++ 的&引用并添加一个级别的指针间接寻址。只需对指针需要修改的参数执行此操作。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void combine(char **ps, const char *ch1, const char *ch2)
{
int size=strlen(ch1) + strlen(ch2);
free(*ps);
*ps = malloc(size + 1);
strcpy(*ps, ch1);
strcat(*ps, ch2);
}
void replace(char **pch1, const char *ch2)
{
free(*pch1);
*pch1 = malloc(strlen(ch2) + 1);
strcpy(*pch1, ch2);
}
void fib(int n)
{
printf("S0 = ' 'n");
if (n >= 1)
{
printf("S1 = 'b'n");
if (n >= 2)
{
printf("S2 = 'a'n");
if (n > 2)
{
char *s = (char*)malloc(2);
char *b = (char*)malloc(2); b[0]='b'; b[1] = 0;
char *a = (char*)malloc(2); a[0]='a'; a[1] = 0;
int i;
for (i = 3; i <= n; i++)
{
combine(&s, a, b);
printf("S%d = '%s'n", i, s);
replace(&b, a);
replace(&a, s);
}
}
}
}
}
int main()
{
int n;
printf("Give the index at which to stop : ");
scanf("%d",&n);
fib(n);
}

查看combine(),唯一需要修改的指针是第一个,所以我char &*s改为char **ps,我们自始至终都用*ps取消引用它。其他参数只是"常规"指针,因为指针本身不需要修改。我把它们const char *

。同样值得注意的是ab的内存分配:

char *b = (char*)malloc(2); b[0]='b'; b[1] = 0;
char *a = (char*)malloc(2); a[0]='a'; a[1] = 0;

我们每个需要两个字节,后面是 NUL 字节;没有这个,你的字符串就会进入疯狂的小镇。这是破坏程序的主要原因。

我认为没有必要将所有分配计数乘以sizeof(char)但也许这是您的个人风格。

编辑:出现怪异符号的原因是在函数fib(int n)中,没有初始化a[1]b[1]意味着动态字符串没有结束标记因此导致奇怪的符号附加到传递给函数的每个字符串的末尾,无论它被combine()还是replace()通过初始化a[1]=0;b[1]=0;解决此问题

编辑:文件名需要以.c结尾,而不是.cpp编译为C而不是C++

编辑:当我编译上面的代码时,我得到:

$ ./a.out
Give the index at which to stop : 6
S0 = ' '
S1 = 'b'
S2 = 'a'
S3 = 'ab'
S4 = 'aba'
S5 = 'abaab'
S6 = 'abaababa'

相关内容

  • 没有找到相关文章

最新更新