如何检查数组指针中的元素?

时间:2013-12-20 15:16:13

标签: c pointers

所以我有这个程序,你首先创建一个数组,然后你必须使用指针在数组中输入整数。整数必须不同。现在,我的问题是程序开始检查元素以检查它崩溃的任何现有整数...我不知道我做错了什么。

源文件:

/*source1.c - using an ADT array*/
/*compile with main.c*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "header1.h"/*defines array*/
int Create()
{
   int *ptr;
   ptr=(int*)malloc(sizeof(int));
   *ptr==0;
   return ptr;
}
bool is_element_of(int x,int *array1)
{
    int i;
    i=0;
    int n=0;
    int flags=0;
    while (array1[i]!=NULL)
    {
        if (x==*array1)
        {
            printf("%d is element of set",x);
            flags=1;
            n++;
        }
        else
        { 
            array1++;
            n++;
        }
    }
}
void Add(int *array1,int x)//add an element to set S
{
    int*ptr;
    ptr=array1;
    int n;
    if(array1==NULL)
    {
        puts("Memory Allocation Failed! Goodbye!");
        exit(EXIT_FAILURE);
    }
    int i;
    int flags;
    printf("Enter an integer: ");
    scanf("%d",x);
    bool is_element_of(int x,int *array1);
    printf("x");
    while(flags==1)
    {
        printf("Error! Please enter a different integer!");
        scanf("%d",x);
        bool is_element_of(int x,int *array1);
    }
    ptr=realloc(ptr,n*sizeof(int));
    array1=x;
    free(array1);
}

标题文件:

//Header1.h - Array Implementation header file
#ifndef HEADER1_H_INCLUDED
#define HEADER1_H_INCLUDED
#include <stdbool.h>
//initializing the array
struct memory
{
    int array1;
};
typedef struct memory Item;

//creates a new empty set
int Create();

//the function that will adds x to array S, if not present
void Add(int *array1,int x);
#endif

3 个答案:

答案 0 :(得分:2)

我可能会被告知“这不是答案”,但我认为这很重要: -

要解决代码中的问题(是的,有许多),您需要对其进行调试。你需要学习如何做到这一点。您可以通过使用笔和纸处理代码流来执行“干运行”之类的操作,也可以使用调试程序

调试器允许您在任何时候单步调试代码,设置断点和检查变量。它是您可以学习的最有用的技能之一,对于任何非繁琐的编程问题几乎都是必要。 StackOverflow是 NOT 你的调试器; - )

首先了解系统上的调试器,逐步执行代码,如果发现某些代码无法理解的特定问题,请在此处询问 - 调试器向您显示的详细信息,以及你期望它展示的内容。

正如@floris所说,在使用调试器之前你可以做更多的事情:阅读 all 编译器的警告,并将编译器视为朋友,而不是被击败提交的敌人 - 打开所有警告,不要忽略它们。好的代码编译ZERO警告。您的系统上也可能有一个名为lint的工具,通常可以进行更深入的检查。

答案 1 :(得分:1)

这个函数中有一个“很多错误”:

bool is_element_of(int x,int *array1)
{
    int i;
    i=0;
    int n=0;
    int flags=0;
    while (array1[i]!=NULL)
    {
        if (x==*array1)
        {
            printf("%d is element of set",x);
            flags=1;
            n++;
        }
        else
        { 
            array1++;
            n++;
        }
    }
}

此循环索引array1[i],但递增n。所以你有一个无限循环。还有更多:您使用指针(NULL)测试数组的内容(int)是否相等 - 一种不同的数据类型。它设置标志,但它不返回任何内容(尽管您声明了返回类型)。

将数组的大小传递给函数会有所帮助,因此它们不会超出边界。对于此功能,您可以通过重写为:

来解决上述所有问题
bool is_element_of(int x, int *array1, int n)
{
    int ii;
    for(ii = 0; ii < n; ii++) {
      if( x == array1[i]) return true;
    }
    return false;
}

如果你必须使用指针:

bool is_element_of(int x, int *array1, int n)
{
    int ii;
    for(ii = 0; ii < n; ii++) {
      if( x == *(array1 + i)) return true;
    }
    return false;
}

如果你想变得非常棘手:

bool is_element_of(int x, int *array1, int n)
{
    int ii;
    for(ii = 0; ii < n; ii++, array1++) {
      if( x == *array1) return true;
    }
    return false;
}

还有很多其他问题,但也许这会给你一些灵感:检查你是否没有超出阵列的末尾,确保你正确地更新你的索引,......

编辑另一个重要的理解问题发生在Add函数中 - 它甚至可能导致崩溃,甚至在您检查元素是否在数组中之前:

printf("Enter an integer: ");
scanf("%d", &m);  // you need to pass the address of the variable, not the value

此外 - 不仅要跟踪数组的大小,还要跟踪到目前为止存储的元素数量:这样你可以在结尾添加一个新值,当你的空间用完时可以(应该)停止。

这是一个很好的练习计划;你有很多需要学习的东西......

答案 2 :(得分:0)

调用scanf时,需要传递对x的引用,而不是x本身。该行应该看起来像scanf(“%d”,&amp; x)。 x也没有理由成为函数的参数,因为它在被使用之前被scanf调用覆盖了;把它变成局部变量。

变量标志永远不会被初始化,这意味着while循环中的条件永远不会为真(除非x恰好是0,但你不知道,因为它没有初始化)。我假设您希望通过调用is_element_of来设置标志,在这种情况下需要发生两件事:is_element_of需要在结尾处具有返回标志 - 当前,尽管被声明为这样,它也不会返回值。

其次,对is_element_of的调用需要是flags = is_element_of(x,array1);.现有行bool is_element_of(int x,int * array1);再次声明该函数但不调用它。