我正在做一个在数组中插入数字的程序,这里很简单,例如:
if(menu==1){
system("cls");
result=lastposition(array,20);
if(result==25){
printf("\n Error! The array is FULL!");
printf("\n Press Enter to continue");
getch();
} else{
printf("\n\n\tOption 1 selected: \n");
printf("\n Type the number to add it to the array: ");
scanf("%i",&value);
if(array[0]!=NULL){
printf("\n The first space is already filled, moving itens");
changeplace(array,20,value);
printf("\n Items moved with success!\n");
}else {
array[0] = value;
}
printf("\n Number %i added!\n",value);
printf(" Press to continue.\n");
getch();
}
所以,这样做,你键入一个数字,它插入一个20位数组,在它的第一个位置(这就是为什么函数“lastposition”在那里,来检查数组中填充的最后位置),如果第一个位置尚未填充(NULL),它在第一个位置添加,如果已经填充,“chageplace”函数将所有值向右移动,然后添加数字!
我的问题是,当我声明数组时,我将其所有值设置为NULL,如下所示:int array[20]={NULL};
!但是在C中,NULL将其所有值都更改为0,如果我的程序中有人将0作为值添加,假设数组已经有5和10,就像这个[5][10][0][0][0]...[0]
一样,我将添加零,得到这样:[0][5][10][0][0]...[0]
,直到没有,但因为C认为NULL = 0,当我尝试添加另一个数字时,它将检查第一个位置是否已经填充(它将检查它是否为NULL ,或0,它将返回NULL [0]),如果我尝试在其上添加7,它将替换0(添加的数字,而不是NULL),它将像[7][5][10][0][0]...[0]
任何人都知道如何解决这个问题?在某种程度上能够在函数中添加0,而不会被下一个数字替换,因为它被认为是NULL?那里有一个真正的“无”,而不是“0”。
PS:我不能把随机数放在数组中,不同于0,原因有两个,首先,菜单选项3显示向量[因此显示随机数,2,我的函数会认为它已经被数字填充了!
PS²:“lastposition”函数返回的“25”只是一个随机数,如果数组的最后一个位置为20(意味着它已经满了),我将设置为返回...
答案 0 :(得分:1)
这在C中根本不可能。一种解决方法可能是将数组元素更改为一个结构,其中字段used
是布尔值,字段data
是int。
答案 1 :(得分:1)
例如,您可以使用负值。但它真的很脏()。
答案 2 :(得分:1)
您可以使用另一个标记值来表示"未使用"。说INT_MAX
或INT_MIN
。
答案 3 :(得分:1)
NULL是一个指针。分配它或与任何其他类型(如int
)进行比较至少应该从编译器产生警告。你从控制台输入指针吗?
整数标量大多数没有保留代码(如果是,那将是实现定义的)。所以你需要一些带外信号来表示“空”。
你可以限制有效的值范围,并使用该范围之外的值作为“空”标记。或者每个条目使用一个额外的标志。对于浮动,有类似的方式,例如使用NaN。
使用结构的单独标志的版本:
#include <stdbool.h>
struct {
bool valid;
int value;
} array[20];
将INT_MIN作为保留值的版本:
#include <limits.h>
#define VALID_MIN (INT_MIN - 1)
#define EMPTY_VALUE INT_MIN
for ( int i = 0 ; i < sizeof(array) /sizeof(array[0]) ; i++ )
array[i] = EMPTY_VALUE;
....
int value;
do {
value = input_value(); // ...
} while ( value < VALID_MIN ) ;
....
答案 4 :(得分:0)
在C中,NULL
实际上总是对指针进行零转换,这就是为什么你看到零。没有特殊的“空”值,在处理整数时不应该使用NULL。
这样做的一种方法是使用另一个布尔数组来说明它是否为空。例如
_Bool isFull[25] = {0}; // Initialize it to all FALSE.
然后检查array[i] == NULL
。
isFull[i] == FALSE
添加元素(包括0)时,设置isFull[i] = TRUE;
。
答案 5 :(得分:0)
您应该只跟踪数组中填充元素的数量。 :)
答案 6 :(得分:0)
您可以使用一个不应该成为数组本身一部分的值。(这意味着如果您将其用作数组,则不应再在数组中输入该值占用指数的指标。)但是你的程序不那么灵活,因为你不能输入你想要的任何值。
另一种方法是使用boolean
,为值本身保存一个变量,另一个作为指标(如果它已填充)。(它可以是{ {1}}或int
只能0
或1
)。
struct values {
int value;
int indicator; // or bool indicator, make sure to include stdbool.h
} array[20];
在不使用占用索引指标的情况下完成所需内容(添加数组的顶部/前部)的一个技巧是向后填充数组。以前的输入没有移动到这也是必要的。
int i = max_elements; // lets say max_elements = 20
printf("\n Type the number to add it to the array: ");
scanf("%i",&value);
array[i] = value; // will fill array[20]
i--; // so that the next input will go to array[19], and so on...
但如果你真的想要改变职位,
int const_index = 0;
printf("\n Type the number to add it to the array: ");
scanf("%i",&value);
array[const_index] = value;
// change positions
for (i = max_elements; i > 0; i--)
array[i + 1] = array[i];
const_index = 0;
或者更好的选择是使用 stack
数据结构。
您可以在这里查看如何操作。