如何在do-while循环中解决此分段错误?

问题描述 投票:2回答:2

您最多只能将15个不同的负载从一个端口运输到另一个端口。运送这些货物的货船的载重量为50吨。枚举载荷,有关每个载荷重量的信息作为输入。

假设每个负载的重量小于或等于50吨且大于0。

您将在一行中从输入中读取每个负载的重量。您的输入将以-1结尾。您将打印必要的旅行次数。

样本输入:

50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 -1

输出:

15  

但是出现此错误,并且每当我向程序提供输入时

./vpl_execution: line 5: 15093 Bus error               (core dumped) ./main

通过我对这种情况的了解,我认为我并没有超出数组索引或使用了错误的指针。另外,我在这里看到了具有解决方案的相同问题,但我想知道为什么代码无法正常工作,然后自己解决问题。非常感谢您的帮助。

#include <stdio.h>
int main()
{   int w,i,t,sum,index;
    int list[16];
    w = 1;
    do
    {   
        scanf("%d",&w);
        list[index] = w;
        index++;
    }while(w >= 0);
    t = 0;
    for(i = 0;i < ((sizeof(list)/sizeof(list[0]))+1);i++)
    {
        sum =0;
        if(sum <= 50)
        {sum += list[i];}
        else
        {t++;}
    }

    printf("%d",t);
    return 0;
}
c algorithm loops segmentation-fault knapsack-problem
2个回答
0
投票

首先,您使用了未初始化的变量index,请使用index=0

同样也有a maximum of 15 different的问题,但是您使用的((sizeof(list)/sizeof(list[0]))+1)除了其末尾的+1之外,这将导致数组边界的传递,这将导致未定义的行为,这是错误的,因为您将在array中元素较少的情况下完全遍历数组。您应在扫描数据时添加一个计数器,第二个循环应以此为基础。

您的代码也不同于问题,如果输入始终为0 < input <= 50,则永远不会输入else statementt++),而您将始终打印0。您发现的是sum而不是重量,并且在解释了有问题的输入后,您将始终打印t=0


0
投票

我在do while循环中遇到分段错误

第一个分段错误发生在此行:

list[index] = w;

您认为index的值是什么?

您未使用值进行初始化,该值可能应该为0

因此,访问list[index]是未定义的行为。就您而言,它导致了分段错误。

然后在for(i = 0;i < ((sizeof(list)/sizeof(list[0]))+1);i++)

此处访问list[i]可能会在i的最后一个值处引起另一个段错误。您应该从+1]中删除((sizeof(list)/sizeof(list[0]))+1)

解决方案:

  1. 执行index = 0;之前执行一次(C0]一次(初始化)>

  2. list[index] = w;中删除+1

  3. 最好改变

    [((sizeof(list)/sizeof(list[0]))+1) to

[for(i = 0;i < ((sizeof(list)/sizeof(list[0])));i++),因为您已经知道for (i = 0; i < 16; ++i)的大小。

这只是消除了段错误,代码中还有其他问题。

我想知道为什么代码不起作用,然后解决我自己的。

您的for循环内的逻辑是错误的。

list

此条件始终为真,并且永远不会执行增加sum =0; if(sum <= 50) 的值的else块。因此,输出始终是您分配给t的初始值。

提示:

继续添加货物(您的t),直到不超过其最大容量(sum吨)。只要总和超过50,就增加所需的货物数量(您的50)并将t重置为sum。重复此过程,直到所有负载都被运输为止(for循环条件将解决此问题),但请记住在遇到0时要循环到break

© www.soinside.com 2019 - 2024. All rights reserved.