【问题标题】:smallest number in array [C]数组中的最小数 [C]
【发布时间】:2021-09-11 06:21:06
【问题描述】:

我正在尝试查找数组的最小元素,我认为我做对了,但是我收到 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

【问题讨论】:

  • 什么是i?需要minimal reproducible example。
  • @Shawn 数组中值的数量,本例中为 5。与数组长度相同。
  • first of u 不需要 else 部分,它只会在每次大于 min 的情况下将其分配给 element 中的第一项。你可以在 min = element[k] 之后的 if 中运行printf("inside if %d", min) 来查看它是否进入内部吗?和一个printf("in loop") for 循环,看看它是否工作正常
  • 作为旁注(不是问题的原因):Why is the gets function so dangerous that it should not be used?
  • 感谢您添加实际代码。您得到的最小值为 0,因为这就是您将数组的第一个元素设置为的值。出于某种原因,您正在用数字 0、1、2、3 等替换从用户那里读取的内容。还有很多其他奇怪的东西,但这是造成问题的主要原因。

标签: arrays c numbers element min


【解决方案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,但现在您遇到了&gt;= 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 中的值,将它们替换为0、1、2 等。所以最小值确实是0。目前尚不清楚这个循环的意义是什么。我建议完全删除它。 elements 中的值的数量只是 i,所以没有什么要计算的。如果您愿意,可以将 i 重命名为 numOfElements。

其他问题:(1)INT_MAX的定义代码需要包含&lt;limits.h&gt;,(2)不应该使用gets。将其更改为使用 fgets 或类似名称。

【讨论】:

  • 嗨,汤姆,感谢您的回复。我之前试过把else拿出来,没有效果,我仍然得到0分钟。
  • @JK3 现在您已经发布了更多代码,我可以看到第二个错误,并且我已经更新了我的答案以包含其他错误修复。刷新你的页面,看看你是否可以让它工作。
  • 明白了,汤姆,谢谢你的帮助!
  • @JK3 很好,很高兴你成功了!正如我所说,计数循环没有任何作用,因为您已经知道有多少元素(即i)。如果您愿意,可以将 i 重命名为 numOfElements。
【解决方案2】:
//NUM OF ELEMENTS
    int numOfElements = 0;
    for(int j = 0; j < i; j++){
        elements[j] = numOfElements++;
    }

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

这里是 gdb 乱七八糟的地方

(gdb) p min
$3 = 0
(gdb) p elem
elem-hash.h  elements     
(gdb) p elements 
$4 = {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++;
    }

【讨论】:

  • "here is the right" -- 我不会称其为“正确”方式,因为该循环除了将 numElements 设置为 i 之外什么也不做,无需循环即可更轻松地完成,例如声明numOfElements = i;。
猜你喜欢
  • 1970-01-01
  • 2021-05-15
  • 2018-01-15
  • 2017-02-13
  • 2017-06-12
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多