数组项分配会产生意外结果

时间:2015-12-10 12:00:00

标签: c arrays

背景:我有一个练习要求我创建一个使用回溯技术比较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;
}

2 个答案:

答案 0 :(得分:3)

您需要更正fillcompare这两项功能。在函数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;。输入数组中没有发生这种情况。

您必须将字符串传递给此函数,或修改此函数以处理常规数组的情况。