在C中编译线性搜索功能时遇到问题

时间:2015-03-13 02:43:21

标签: c

我有一个线性搜索器功能,可以打印出某个数字在数组中的位置,如果找不到,则应该返回“Nothing found”。但是,它似乎既可以打印它所在的位置,也不会找到它。我想知道我在哪里有错误?谢谢!

void searcher(int *array, int n, int key){

     for( int i = 0; i < n; i++){
       if(array[i] == key){

         printf(" %d is present at location %d.\n", key, i+1);
         break;
       }

     }
     if( i == 0)
       printf(" %d is not present in the array.\n", key);


}

2 个答案:

答案 0 :(得分:2)

您的错误是您在循环范围中声明了i,因此您在循环中使用的i与您在循环外使用的i不同。你几乎肯定有一个名为i的全局或静态,这是一个非常糟糕的命名实践,碰巧有值为0.

此外,即使您在功能范围内声明i,您写的代码也不会打印&#34;不存在于数组&#34;除非n <= 0,因为您对该打印的测试不正确。出于类似的原因,如果在n> 1时第一个元素恰好匹配,它将打印出两个选项。这是因为你在增加匹配的i之前就打破了循环。

你可以像这样重写它:

void searcher(int *array, int n, int key)
{
  int i;

  for (i = 0; i < n && array[i] != key; ++i);

  if (i < n)
    printf(" %d is present at index %d.\n", key, i);
  else
    printf(" %d is not present in the array.\n", key);
}

答案 1 :(得分:0)

这个问题已经有了一个很好解释的答案,但这里的方法与jschultz略有不同。

void searcher(int *array, int n, int key)
{
  int flag=1;
for( int i = 0; i < n; i++){
       if(array[i] == key){
         flag=0;
         printf(" %d is present at location %d.\n", key, i+1);
         break;
       }
      }
     if(flag)
       printf(" %d is not present in the array.\n", key);
}