gpt4 book ai didi

检查值是否已存在于数组中

转载 作者:太空宇宙 更新时间:2023-11-03 23:43:29 25 4
gpt4 key购买 nike

我是 C 的新手,目前正在学习数组。我想检查某个值是否在数组中,但我遇到了一些问题(不仅在语法方面而且在理解方面)。

我的目标是拥有一个我可以调用的函数,给它两个参数——要搜索的值和要搜索的数组——并根据是否找到返回 0 或 1。

我的方法如下:

#include <stdio.h>
#include <stdlib.h>

int valueinarray(float val, float *arr[]);

int main()
{
float arr[] = {5, 4.5, 4, 3.5, 3, 2.5,};
int test = valueinarray(4.5, *arr[]);
printf("%d", test);

return 0;
}

int valueinarray(float val, float *arr[]){
int i;
for(i = 0; i < sizeof(*arr[]); i++){
if(*arr[i] == val) return 1;
}
return 0;
}

我现在有两个问题,尤其是关于语法的问题:

  1. 如果我创建一个将指针作为其参数之一的函数,我是否必须始终在函数内部使用“*arr[]”来引用它?还是“arr[]”甚至“arr”就足够了?

  2. 我是否正确理解我无法将整个数组传递给函数,所以我改用指针?

此外,我的方法是错误的,我不明白为什么。遍历数组似乎工作得很好,甚至检查其中是否有某个值也能正常工作,问题似乎出在我调用函数的方式上。我读到了双指针,这是需要它们的场景吗?如果不是,需要它们做什么?

最佳答案

使用sizeof(*arr[])是错误的,而且使用sizeof(arr)也是错误的。您无法确定在 C 中作为参数传递的数组的大小。只有调用者知道此信息。您还必须将大小(或元素数量)作为附加参数传递。

此外,您应该为 i 使用 size_t,因为您实际上返回的是 bool 结果(01 ) 您可以使用 bool 作为 stdbool.h header 中可用的返回类型(自 C99 起),或 _Bool(对于C89).

这是将元素数量作为第三个参数的正确实现:

bool valueinarray(float val, float *arr, size_t n) {
for(size_t i = 0; i < n; i++) {
if(arr[i] == val)
return true;
}
return false;
}

或者,如果需要,您可以传递数组的大小,然后进行简单的除法以确定元素的数量:

bool valueinarray(float val, float *arr, size_t size) {
for(size_t i = 0; i < size / sizeof(*arr); i++) {
if(arr[i] == val)
return true;
}
return false;
}

最后,请注意由于floating point math being imprecise ,在处理浮点值时,例如 floatdouble,您应该避免严格的相等性检查。参见 How should I do floating point comparison?了解更多信息

关于检查值是否已存在于数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39742123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com