我一直在尝试开发一个对数组进行排序的控制台程序,然后允许用户在数组中搜索特定值。在大多数情况下,排序部分工作正常(虽然我想将它简化为一个for循环,但它现在必须要做)。
然而,无论我输入什么数字,搜索部分每次都会给我6487516号码。我确定它与我的函数find_number有关,我只是不知道是什么。
#include <stdio.h>
#include <stdlib.h>
#define NOT_FOUND -1
#define num 9
int main(int argc, char *argv[])
{
int ask,how_many;
int user_array[num];
int sorted_array[num];
int i,temp,junction;
printf("type 10 numbers with spaces in between then press enter \n, type the numbers again then press enter, after this press q and then press enter ");
for (i = 0; i<=num ; ++i)
scanf(" %d ",&user_array[i]);
//printf("type ");
for (i = 0; i<=num ; ++i)
scanf(" %d ",&sorted_array[i]);
for (i = 0; i<=num ; ++i)
printf(" A : %d ",user_array[i]);
for (i = 0; i<=num ; ++i)
printf(" B : %d ",sorted_array[i]);
for (i = 0; i <= num; ++i)
{
for (junction = 0; junction <= num - i; junction++)
{
if (sorted_array[junction] > sorted_array[junction+1] )
{
temp = sorted_array[junction];
sorted_array[junction] = sorted_array[junction+1];
sorted_array[junction +1] = temp;
}
}
}
printf (" Left is the Sorted right is the Original");
for (i = 0; i<= num; ++i)
printf(" \n %d, %d ",sorted_array[i],user_array[i]);
printf (" What number do you want to search for?\n");
fflush (stdin);
scanf (" %d",&ask);
printf (" how many numbers? \n");
fflush (stdin);
scanf (" %d",&how_many);
int truth = find_number (sorted_array, ask, how_many);
printf (" %d",&truth);
return 0;
}
int find_number( const int target[10], int goal, int n)
{
int z,found = 0,locate;
int i = 0;
while (!found && i < n)
{
if (target[i] == goal)
found = 1;
else
++i;
}
if (found)
locate = i;
else
locate = NOT_FOUND;
return locate;
}
答案 0 :(得分:2)
这是C中的一个成语:
#define N 20
int array [N];
for (int j=0; j < N; ++j)
//do something with array[j]
请注意,不是 j <= N
。这导致访问 un 分配的数组元素,即array[N]
。
答案 1 :(得分:1)
您的代码中存在多个问题:
num
应定义为10
,以使数组具有10个元素(!)
你过多地迭代数组。经典的C语言是for (i = 0; i < n; i++) { ... }
,其中n
是数组的大小,即元素的数量。由于数组基于0
,因此数组中的最后一个有效索引为n - 1
。
您的scanf()
格式中有额外的空格,可能用于美容目的。尾随有副作用:scanf()
将保持读取输入,直到它得到不是空白的东西。不要这样做。
fflush(stdin);
调用未定义的行为。删除它。
find
函数适用于任何大小的数组,删除原型中的硬编码10
大小,无论如何都会被编译器忽略。
以下是更正后的版本:
#include <stdio.h>
#include <stdlib.h>
#define NOT_FOUND (-1)
#define NUM 10
int find_number(const int *target, int goal, int n);
int main(int argc, char *argv[]) {
int ask, how_many;
int user_array[NUM];
int sorted_array[NUM];
int i, temp, junction;
printf("type %d numbers with spaces in between then press enter\n"
"type the numbers again then press enter, "
"after this press q and then press enter", NUM);
for (i = 0; i < NUM; ++i)
scanf("%d", &user_array[i]);
for (i = 0; i < NUM; ++i)
scanf("%d", &sorted_array[i]);
for (i = 0; i < NUM; ++i)
printf(" A : %d\n", user_array[i]);
for (i = 0; i < NUM; ++i)
printf(" B : %d\n", sorted_array[i]);
for (i = 0; i < NUM; ++i) {
for (junction = 0; junction < NUM - i - 1; junction++) {
if (sorted_array[junction] > sorted_array[junction + 1]) {
temp = sorted_array[junction];
sorted_array[junction] = sorted_array[junction + 1];
sorted_array[junction + 1] = temp;
}
}
}
printf (" Left is the Sorted right is the Original\n");
for (i = 0; i < NUM; ++i)
printf("%5d, %5d\n", sorted_array[i], user_array[i]);
printf(" What number do you want to search for?\n");
scanf("%d", &ask);
printf(" how many numbers?\n");
scanf("%d", &how_many);
int truth = find_number(sorted_array, ask, how_many);
printf(" %d\n", &truth);
return 0;
}
int find_number(const int *target, int goal, int n) {
int i;
for (i = 0; i < n; i++) {
if (target[i] == goal)
return i;
}
return NOT_FOUND;
}
注意:
您应将user_array
复制到sorted_array
,而不是要求用户再次输入数字。
您应该使用更好的算法在已排序的数组中进行搜索。