我正在尝试创建一个函数fib(n(,该函数将两个字符a
和b
作为初始参数,然后为给定索引打印斐波那契数列的每个项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 *
好
。同样值得注意的是a
和b
的内存分配:
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]
意味着动态字符串没有结束标记