C尝试在数组中搜索特定数字

时间:2016-10-31 20:22:39

标签: c arrays sorting search

我一直在尝试开发一个对数组进行排序的控制台程序,然后允许用户在数组中搜索特定值。在大多数情况下,排序部分工作正常(虽然我想将它简化为一个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;
}

2 个答案:

答案 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,而不是要求用户再次输入数字。

  • 您应该使用更好的算法在已排序的数组中进行搜索。