所以我有这个程序,你首先创建一个数组,然后你必须使用指针在数组中输入整数。整数必须不同。现在,我的问题是程序开始检查元素以检查它崩溃的任何现有整数...我不知道我做错了什么。
源文件:
/*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
答案 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);再次声明该函数但不调用它。