数组中的最小数字 [C]

smallest number in array [C]

我正在尝试查找数组的最小元素,我认为我做对了,但是我收到 0 作为我的最小元素,但是,我没有为我的数组的任何元素输入 0。 我知道这里有些事情做得不好,但这是我的全部代码,以便可重现和修复。

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
int main(){
    char input[500];

    printf("Enter a list of whitespace-separated real numbers terminated by EOF or 'end'.");
    puts("");
    printf("-----------------------------------------------------------------------------");
    puts("");
    gets(input);

    int size = strlen(input);
    
    int elements[size];
    int i = 0;

    char *p = strtok(input," ");

    while( p != NULL)
    {
       elements[i++] = strtol(p, NULL, 10);
       p = strtok(NULL," ");
    }

    //NUM OF ELEMENTS
    int numOfElements = 0;
    for(int j = 0; j < i; j++){
        elements[j] = numOfElements++;
    }
    
    //MIN ELEMENT
    int min = INT_MAX;
    for(int k = 0; k < i; k++){
        if(elements[k] < min){
            min = elements[k];
        }
    }

    printf("-----------------------------------------------------------------------------\n");
    printf("# of Elements:          %d\n", numOfElements);
    printf("Minimum:            %d\n", min);


    return 0;
}

结果:

    Enter a list of whitespace-separated numbers.
-----------------------------------------------------------------------------
1 2 3 4 5
-----------------------------------------------------------------------------
# of Elements:                  5
Minimum:                        0

预期:

    Enter a list of whitespace-separated numbers.
-----------------------------------------------------------------------------
1 2 3 4 5
-----------------------------------------------------------------------------
# of Elements:                  5
Minimum:                        1

原始发布摘录中的问题是此循环中的 else

int min = INT_MAX; //I tried int min = elements[0] also
for(int k = 0; k < i; k++){
    if(elements[k] < min){
        min = elements[k];
    }else{
        min = elements[0];
    }
}

考虑一下如果您在数组的中途会发生什么情况,并且您已更新 min 多次,但现在您遇到了一个 >= min 的元素。 else 会将 min 重置为 elements[0]。直接删除:

int min = INT_MAX; //I tried int min = elements[0] also
for(int k = 0; k < i; k++){
    if(elements[k] < min){
        min = elements[k];
    }
}

顺便说一句,min 的任一初始化都可以。如果将其初始化为 elements[0],则可以在 k = 1.

处开始循环

更新:以上答案基于最初发布的代码摘录。现在已经发布了更多代码(并且应用了我上面显示的修复),还有其他问题。

主要问题是 numOfElements 循环。这个循环完全擦除 elements 中的值,用 012 等替换它们。所以最小值确实是 0。不清楚这个循环的意义是什么。我建议完全删除它。 elements 中的值的数量只是 i,因此无需计算。如果您愿意,可以将 i 重命名为 numOfElements

其他问题:(1)代码需要包含<limits.h>来定义INT_MAX,以及(2)不应该使用gets。将其更改为使用 fgets 或类似的东西。

//NUM OF ELEMENTS
    int numOfElements = 0;
    for(int j = 0; j < i; j++){
        elements[j] = numOfElements++;
    }

这里有问题,当你得到这个数组的计数时你重置了元素数组

这里传过来的时候gdb乱七八糟

(gdb) p min
 = 0
(gdb) p elem
elem-hash.h  elements     
(gdb) p elements 
 = {0, 1, 2, 3, 4, 5, -8096, 32767, 1431652112, 21845, 1431652512}

这里是对的

//NUM OF ELEMENTS
    int numOfElements = 0;
    for(int j = 0; j < i; j++){
        numOfElements++;
    }