背景:我有一个练习要求我创建一个使用回溯技术比较2个int数组的函数。如果数组不同,则函数应返回0,如果数组相同则返回1。数组的大小,填充它们的方法和程序的输出都没有在问题中指定,因此我冒昧地以自己的方式解决它们。
使用for
我创建了一个简单的fill
函数,它以简单的方式填充了两个数组,因此如果用户输入s
,结果应为
A[0]=B[0]=0
A[1]=B[1]=1
...
A[50]=B[50]=50
如果他输入d
,它应该是相同的但是
B[i]=A[i]+1
问题:
而不是A[0]=0
它最终成为A[0]=50
(以及A[0]=51
案例中的d
),这使得整个函数在每种情况下都返回0
。我尝试过很多东西,但我无法正常使用
以下是代码:
#include <stdio.h>
#include <stdlib.h>
void fill(int a, int A[],int B[])
{
int i,j;
if (a)
{
for(i=0;i<=50;i++)
{
A[i]=i;
B[i]=A[i];
}
}
else
{
for(i=0;i<=50;i++)
{
A[i]=i;
B[i]=i+1;
}
}
A[0]=0;
for (j=0;j<=50;j++)
printf("\nka %d %d %d",j, A[j],B[j]); //the purpose of this is to check the state of the two arrays after filling them, it's how I spotted the problem, it will be deleted in the final form
}
int compare(int i, int A[],int B[])
{
int a,b;
a=A[i];
b=B[i];
printf("j %d %d\n", a,b);
if (B[i+1]!='\0')
{
if (A[i]==B[i])
{
compare (i+1,A,B);
}
else
{
return 0;
}
}
else
return 1;
}
int main()
{
int A[50], B[50], i=0;
char s;
printf("Do you want the arrays to be the same or different?\n");
printf("Input 's' or 'd': ");
scanf("%c", &s);
switch(s)
{
case 's':
case 'S':
fill(1,A,B);
break;
case 'd':
case 'D':
fill(0,A,B);
break;
default:
printf("Sorry incorrect input, please input 's' or 'd'");
return 0;
break;
}
if (compare(i,A,B))
printf("They are the same");
else
printf("They are different");
return 0;
}
答案 0 :(得分:3)
您需要更正fill
和compare
这两项功能。在函数fill
中,您正在访问超出边界的数组,这将调用未定义的行为。循环应该从0
迭代到50
(不包括50
)
for(i=0;i<50;i++) { ... }
函数compare
应该像
// Pass the size of array to the function.
int compare(int i, int A[],int B[], int n)
{
if (i != n)
{
if (A[i]==B[i])
{
return compare (i+1, A, B, n);
}
else
{
return 0;
}
}
else
return 1;
}
答案 1 :(得分:0)
问题出在for循环中。它循环播放51个元素。
for (i=0;i<=50;i++)
它应循环50个元素
for (i=0;i<50;i++)
类似于j的循环,在fill
函数中。
compare
功能中也存在问题。退出检查是
if (B[i+1]!='\0')
这意味着输入数组必须包含最后一个元素&#39; \ 0&#39;。输入数组中没有发生这种情况。
您必须将字符串传递给此函数,或修改此函数以处理常规数组的情况。