我试图以相反的顺序实现线性搜索算法,但问题是这段代码编译得很好,没有显示任何错误。但在运行时它没有显示任何输出。为什么??如果有任何问题请帮我清除。
#include<stdio.h>
int reverse(int a[], int key)
{
int i = sizeof(a) - 1;
while (i >= 0)
if (a[i] == key)
return i;
i--;
return -1;
}
int main()
{
int x;
int arr[] = {3, 2, 4, 5, 1};
x = reverse(arr, 4);
printf("%d\n", x);
return 0;
}
答案 0 :(得分:4)
你的缩进是误导。你的意思是:
int reverse(int a[], int key) {
int i = sizeof(a) - 1;
while (i >= 0) {
if (a[i] == key) {
return i;
}
i--;
}
return -1;
}
你写的内容相当于:
int reverse(int a[], int key) {
int i = sizeof(a) - 1;
while (i >= 0) {
if (a[i] == key) {
return i;
}
}
i--;
return -1;
}
永远不会更新i
,会导致无限循环。
这就是为什么我一直告诉别人总是用if
包裹循环和else
/ { }
块。
顺便说一下,sizeof
不会给你你所期望的。实际上,它的返回值是表示变量所需的字节数。不是数组的元素数量。另请注意,reverse
将a
指针收到arr
,而非参考或副本。事实上,这个:
int reverse(int a[], int key) {
相当于:
int reverse(int *a, int key) {
因此,在reverse
内,sizeof (a)
相当于sizeof (int*)
。这称为数组(或指针)衰减。
修复并稍微清理代码会导致:
#include <stdio.h>
#define ARR_SIZE 5
int reverse(int a[], int aSize, int key) {
int i;
for(i = aSize - 1; i >= 0; --i) {
if (a[i] == key) return i;
}
return -1;
}
int main() {
int arr[ARR_SIZE] = {3, 2, 4, 5, 1};
int x = reverse(arr, ARR_SIZE, 4);
printf("%d\n", x);
return 0;
}
按预期工作。
答案 1 :(得分:0)
你的反向功能应该是
int reverse(int a[], int length, int key){
int i = length-1;
while (i >= 0){
if (a[i] == key)
return i;
i--;
}
return -1;
}
您还应该阅读有关sizeof的正确用法。