使用C查找元素是否在数组中(语法问题)

时间:2017-07-05 16:20:14

标签: c arrays debugging

我正在尝试编写一个函数来检查元素是否是C中的数组。我在这里有一个函数,但它总是返回0,所以任何调试帮助都会受到赞赏:

#include <stdio.h>
int array[] = {1, 2, 3};
int *parray = &array;
int j;
int n = sizeof(array)/sizeof(array[0]);

int ifInList(int array[], int n){
    for (j = 0; j < n; j++){
        if (array[j] == n){
           return 1;
        }
    }
    return 0;
}

int main(){
    printf("The number is %d \n", ifInList(&array[n], 1));
    return 0;
}

4 个答案:

答案 0 :(得分:3)

您搜索错误:

ifInList(&array[n], 1);

arr[0]    arr[1]            ....   a[n-1]    a[n]     
<----Search only these many elements --->     ^~~~You are searching unreserved address.

访问a[n]可能会导致很难调试的错误。你不应该在第一时间这样做。

正确的代码:

ifInList(array, sizeOfArray, valueToFind);  //searches in the complete array

for (j = 0; j < sizeOfArray; j++){  //Loop 
      if (array[j] == valueToFind){

另一个重要的建议是,在不一定需要时尽量避免使用全局变量。

答案 1 :(得分:3)

用于检查元素n是否在数组中的工作代码:

int ifInList(int array[], int size, int n) {
    int j;
    for(j=0; j<size; j++)
        if(array[i]==n)
            return 1;
    return 0;
}

您需要三个参数才能执行此操作。您正在寻找的数组,大小和元素。

关于您的代码的其他事项:

全局变量通常是一个坏习惯。虽然你可以(理论上,也许,但可能不会)将数组和它的大小作为一个全局来逃避,但绝对没有理由让j成为全局。它应该在函数ifInList中。

作为一般规则:

如果你方便使用全局变量,那么你做错了。

答案 2 :(得分:2)

您的代码中存在两个问题:

  1. 您正在访问保留的内存地址:array[n]
  2. ifInList范围内,您打算将名称n用于数组大小(您的全局变量)和您要查找的值。
  3. 特别是:

    访问您不拥有的内存地址

    在这一行:

    printf("The number is %d \n", ifInList(&array[n], 1));
    

    您将&array[n]作为参数传递给ifInList。这引入了两种类型的错误:

    1. 寻址错误:array[n]不存在。它指的是数组的n+1 - 元素,一个你没有保留的内存地址。换句话说,你是“出界”。
    2. 逻辑错误:您没有传递数组第一个元素的地址。如果你把它修改为array[n-1],你的函数只会查看数组的最后一个元素。要从第一个元素开始搜索,您需要传递array&array[0];两者都是相同的,并引用第一个元素的内存地址。
    3. 冲突的变量名称

      首先要做的事情是:全局变量几乎总是一个坏主意,它们只应用于“快速和脏”的程序和/或用于快速调试目的,因为它们会引起混淆。

      您将n定义为全局变量,它指的是array的大小。然而,在函数ifInList中,变量n具有不同的含义:它是您正在寻找的关键。因此,如果您在array中查找包含3个元素的“42”,则您的函数将查找42个不同的元素,而不是3个!

      为避免这种混淆,请为您要查找的密钥指定一个不同的名称:

      int ifInList(int array[], int k){
          for (j = 0; j < n; j++){
              if (array[j] == k){
                 return 1;
              }
          }
          return 0;
      }
      

      建议的方法是使用键作为参数提供大小,从而完全消除对全局变量和任何其他潜在冲突的需要。此外,这是一个干净的编程实践。请注意我如何在函数中定义j

      int ifInList(int array[], int n, int k){
          int j;
          for (j = 0; j < n; j++){
              if (array[j] == k){
                 return 1;
              }
          }
          return 0;
      }
      

答案 3 :(得分:2)

虽然您已经对问题有了很好的答案,但继续发表评论,请务必避免使用全局变量。在适当范围内声明变量可避免在项目变大时出现许多潜在问题和名称冲突。您可以在main()中轻松声明所有变量,并根据需要将它们作为参数传递,以使其在代码的其他部分中可用。一个简单的例子是:

#include <stdio.h>

int ifinlist (int *array, size_t nelem, int n){

    for (size_t j = 0; j < nelem; j++)
        if (array[j] == n)
        return 1;

    return 0;
}

int main (void) {

    int array[] = {1, 3, 5},
        n = sizeof array / sizeof *array;

    for (int i = 0; i <= array[n - 1]; i++)
        printf ("The number '%d' %s present\n", 
            i, ifinlist (array, n, i) ? "is" : "is not");

    return 0;
}

示例使用/输出

代码的简单输出是:

$ ./bin/array_inlist
The number '0' is not present
The number '1' is present
The number '2' is not present
The number '3' is present
The number '4' is not present
The number '5' is present

祝你好运。