【问题标题】:Loop is ignoring to increment the size of the array循环忽略增加数组的大小
【发布时间】:2014-10-14 03:11:20
【问题描述】:

在下面的 main 方法中,我试图调用一个排序函数,并且在函数从用户输入中选择后者之后,它必须在最后使用 for 循环相应地打印排序。但是我有一个警告,上面写着“循环将最多运行一次(循环增量从未执行)”指向array[arraySize]。它是否与上面的返回类型或其他 for 循环有关?这里发生了什么事?谁能指出并解释一下。非常感谢!下面是代码:

int main()
{
    long array[100], arraySize;
    char sort;
    long maxi = 100;

    for(arraySize = 0; arraySize < maxi; arraySize++)
    {
        printf("Enter any positive integer, enter 0 to stop: ");
        scanf("%li", &num);

        if(num < 0) {
            arraySize--;
            printf("I said positive!");
            count++;
        }
        else if(num == 0) {
            maxi = arraySize;
        }
        else {
            array[arraySize]=num;
            arraySize--;
        }
    }

    printf("Please enter A for ascending or D for descending order\n");
    scanf("%s", &sort);

    bubble_sort(array, arraySize, sort); //calling the sort function

    printf(" Sorted list in the selected order:\n");
    for (arraySize = 0; arraySize < num; arraySize++) {
        printf("%ld \n", array[arraySize]);
    puts("");
    return 0;
    }
}

编辑:感谢大家的所有建议。我确实做了一些改变,这就是我到目前为止所做的。现在它正在跳过 A/D 用户输入以及 bubble_sort 函数逻辑。以下是它作为最终输出的作用: 注意:long num 被声明为全局变量!

int main()
{
    long array[100], arraySize;
    char sort;
    long maxim = 100;

    for(arraySize = 0; arraySize < maxim; arraySize++)
    {
        printf("Enter any positive integer, enter 0 to stop: ");
        scanf("%li", &num);

        if(num < 0)
        {
            arraySize--;
            printf("I said positive! \n");
            count++;
        }
        else if(num == 0)
        {
            maxim = arraySize;
        }
        else
        {
            array[arraySize]=num; //arraySize--;
        }
    }

    printf("Please enter A for ascending or D for descending order: \n");
    scanf("%c", &sort);

    bubble_sort(array, maxim, sort); //calling the sort function

    printf("Sorted list in the selected order:\n");
    for (arraySize = 0; arraySize < maxim; arraySize++)
    {
        printf("%ld \n", array[arraySize]);
    }
    puts("");
    return 0;
}

任何更多的建议将不胜感激!

【问题讨论】:

  • 为什么你每次都在那个for循环中做arraySize--arraySize++ 究竟什么时候会显示出它的真面目?它不会在整个循环中始终保持相同的状态,除非num == 0,因为只有这样代码才没有使用arraySize--else 部分应该只包含 array[arraySize] = num; 而没有其他内容,让 arraySize 在此之后增加 1,以便可以在下一个索引处添加新值。
  • char sort; .... scanf("%s", &amp;sort); 不好。
  • @nIcEcOw arraySize 每次我都不必在bubbleSort 函数的循环中使用 arraySize-i
  • @pointing_Stack 同意scanf("%s",... 将接受用户输入,但会将结果存储为字符串。如果用户输入A,那么'A' 将存储在sort 中,'\0' 将存储在下一个地址中——谁知道那个会做什么?建议改为scanf(" %c", &amp;sort
  • @pointing_Stack BTW:最佳实践:检查scanf() 系列函数的结果,即使看起来没有必要。

标签: c loops for-loop


【解决方案1】:

还有一些其他问题,但让我们谈谈您的警告。你有这个代码:

for (arraySize = 0; arraySize < num; arraySize++) {
    printf("%ld \n", array[arraySize]);
    puts("");
    return 0;
}

更正的缩进应该清楚为什么该循环最多运行一次。

【讨论】:

  • 我在我的类似程序中使用过这个循环,它运行良好。我仍然不确定为什么它会说这个警告。对不起,我还是个初学者。
  • @pointing_Stack:你明白你的return 0;声明是什么意思吗?
  • 是的,我将它从这个 for 循环的范围中移出并编辑了一些我现在要添加到这里的东西。
【解决方案2】:

您的打印循环似乎有错字,应更正为:

    for (arraySize = 0; arraySize < maxi; arraySize++) {

另外,对 bubble_sort() 的调用应该使用 maxi 而不是 arraySize。

【讨论】:

  • 我改了还是没解决问题。
  • 您是否确保将“返回 0”行也移到循环之外?
  • 是的,我也这样做了!
【解决方案3】:

最后输入的字符存储在sort 中,该字符很可能是\n
scanf("%c", &amp;sort); 更改为scanf(" %c", &amp;sort); 应该可以解决问题。 注意%c前面的空格。

【讨论】:

  • 我从来没有想过。它确实解决了我遇到的所有问题。非常感谢!这些小错误中的每一个都在教我一些大事。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多