使用指针在线性搜索中多次出现的函数

时间:2018-01-02 18:24:49

标签: c

这是我在线性搜索中多次出现的代码。你能帮我指出错误吗?我希望函数在指针数组中存储多个值,然后再打印数组

#include <stdio.h>

void linearsearch(int n,int a[n],int x,int count,int *b[count])
{
    count=0;
    int i;
    for(i=0;i<n;i++)
    {
        if(a[i]==x)
        {
            count+=1;
        }
    }
    int j=0;
    for(i=0;i<n;i++)
    {
        if(a[i]==x)
        {
            b[j]=i;
            j++;
        }
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    int a[n];
    int i;
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    int x;
    scanf("%d",&x);
    int count;
    int *b[count];
    linearsearch(n,a,x,count,b);
    for(i=0;i<count;i++)
    {
        printf("%d",*b[i]);
    }
    return 0;
}

3 个答案:

答案 0 :(得分:0)

我认为有几个错误。

    必须初始化
  • count,例如int count = 0;
  • 在linearsearch函数之后,
  • count变量未更改。
  • b数组应该动态分配。

建议的补丁是:

#include <stdio.h>

void linearsearch(int n,int a[n],int x,int *count,int **b)
{
    count=0;
    int i;
    for(i=0;i<n;i++)
    {
        if(a[i]==x)
        {
            count+=1;
        }
    }
    int j=0;
    for(i=0;i<n;i++)
    {
        if(a[i]==x)
        {
            *b = realloc(*b, sizeof(int) * (j + 1));
            (*b)[j]=i;
            j++;
        }
    }
}
int main()
{
int n;
scanf("%d",&n);
int a[n];
int i;
for(i=0;i<n;i++)
{
    scanf("%d",&a[i]);
}
int x;
scanf("%d",&x);
int count = 0;
int *b = NULL;
linearsearch(n,a,x,&count,&b);
for(i=0;i<count;i++)
{
    printf("%d",b[i]);
}  
return 0;
}

答案 1 :(得分:0)

理想的方法是根据找到的b[j]=i; 的数量动态分配内存。但是,让我们先看看错误。也许在讨论之后你可以编写代码。

i

在被调用函数中,让我们剖析它的类型。

int的类型为b[j]int*的类型为%d。然后你分配了它们(类型不匹配)。然后int需要int*,但您传递的是count类型的内容。这是未定义的行为。

现在又出现了另一个缺陷 - 你通过search并且不知何故,你预计main()中你改变的价值将会出现在#include <stdio.h> #include <stdlib.h> int* linearsearch(int n,int* a,int x,int* count) { *count=0; if( n <= 0){ fprintf(stderr, "%s\n","Error" ); exit(1); } int *t = malloc(sizeof(*t)*n); if( t == NULL){ perror("Malloc failed"); exit(1); } for(int i = 0; i < n; i++) if(a[i] == x) t[(*count)++] = i; int *temp = realloc(t,sizeof(*temp)* (*count)); if( temp == NULL){ perror("Realloc failed"); exit(1); } t = temp; return t; } int main(void) { int n; if( scanf("%d",&n)!= 1){ fprintf(stderr, "%s\n", "Error in input"); exit(1); } if( n <= 0 ){ fprintf(stderr, "%s\n", "Error in input : must be greater than 0"); exit(1); } int a[n]; for(int i=0; i < n; i++) if(scanf("%d",&a[i])!=1){ fprintf(stderr, "%s\n","Error in input." ); exit(1); } int elmt_to_find; if( scanf("%d",&elmt_to_find)!= 1){ fprintf(stderr, "%s\n", "Error in input : Element to find(must be integer)"); } int count; int *b = linearsearch(n,a,elmt_to_find,&count); for(int i = 0; i < count; i++) printf("%d ",b[i]); printf("%s","\n"); free(b); return 0; } 中。 C是按值传递的,您更改为局部变量。当被叫函数结束时,这种变化就会消失。

{{1}}

答案 2 :(得分:0)

如果您希望坚持使用b的VLA,只有当linearsearch为NULL时,您才可以将count更改为返回b。然后,您可以将b创建为VLA,然后再将其传回linearsearch进行填充。

int count = linearsearch(n, a, x, 0, 0);
int b[count];
linearsearch(n, a, x, count, b);

然后,您的功能可能如下所示:

int linearsearch(int n,int a[n],int x,int count,int *b[count])
{
    int i;
    if(count==0)
    {
        for(i=0;i<n;i++)
        {
            if(a[i]==x)
            {
                count+=1;
            }
        }
    }
    if (b==0)
    {
        return count;
    }
    int j=0;
    for(i=0;i<n;i++)
    {
        if(a[i]==x)
        {
            b[j]=i;
            j++;
        }
    }
    return count;
}