我写了一个代码,它接受输入,直到输入EOF整数(在本例中为999999)。然后它对数字进行排序并在整数数组中搜索我们的针(整数)(称为haystack)。现在我在搜索算法中遇到了问题。编译时会向我显示警告:
'搜索':并非所有控制路径都返回值
我认为这意味着在某些情况下该功能可能不会返回任何内容,但问题是我无法想到任何此类情况。我甚至用很多值检查了我的程序,它总是给我正确的输出。任何人都可以帮我找出问题所在。我为此使用了一些 windows native tools compiler 。
此外,如果有人看到与此相关的 CS50 pset3发现问题,我也使用相同的搜索功能,但在 CS50 IDE 中编译代码时程序从未显示它是否在大海捞针中找到针头。它只是按顺序排列它们然后在那之后停止。
#include <stdio.h>
#include "cs50.h"
#include <stdlib.h>
bool search(int value, int values[], int n);
void sort(int values[], int n);
// maximum amount of hay
#define MAX 65536
int main(int argc, string argv[])
{
// ensure proper usage
if (argc != 2)
{
printf("Usage: ./find needle\n");
return -1;
}
// remember needle
int needle = atoi(argv[1]);
// fill haystack
int size;
int haystack[MAX];
for (size = 0; size < MAX; size++)
{
// wait for hay until EOF
printf("\nhaystack[%i] = ", size);
int straw = GetInt();
if (straw == 999999)
{
break;
}
// add hay to stack
haystack[size] = straw;
}
printf("\n");
// sort the haystack
sort(haystack, size);
// try to find needle in haystack
if (search(needle, haystack, size))
{
printf("\nFound needle in haystack!\n\n");
return 0;
}
else
{
printf("\nDidn't find needle in haystack.\n\n");
return 1;
}
}
/**
* Returns true if value is in array of n values, else false.
*/
bool search(int value, int values[], int n)
{
/* TODO: implement a searching algorithm */
int first = 0;
int last = n;
int middle = (first + last) / 2;
while (first + 1 < last)
{
if (value == values[middle])
{
return true;
break;
}
if (value == values[first])
{
return true;
break;
}
if (value == values[last])
{
return true;
break;
}
if (value < values[middle])
{
last = middle;
middle = (first + last) / 2;
}
if (value > values[middle])
{
first = middle;
middle = (first + last) / 2;
}
}
if (first + 1 >= last)
{
return false;
}
}
/**
* Sorts array of n values.
*/
void sort(int values[], int n)
{
// TODO: implement an O(n^2) sorting algorithm
for (int j = 1; j < n; j++)
{
for (int i = 0; i < (n - 1); i++)
{
if( values[i + 1] < values[i])
{
int b = values[i + 1];
values[i + 1] = values[i];
values[i] = b;
}
}
}
for (int k = 0; k < n; k++)
{
printf("haystack[%d] = %d ", k, values[k]);
}
}
答案 0 :(得分:1)
编译器不执行您的代码。它不进行价值追踪。虽然你可以推断出变量和表达式的值,但这通常是编译器的无法解决的问题。
您的编译器告诉您,当控件到达函数的结束search
时,它不知道从}
返回什么。
sort
的函数是个坏主意,因为C标准库包含一个具有相同名称的函数。